部分函數應用程序允許您通過預填充一些參數來修改函數。它與泛函和其他函數運算符結合使用特別有用。
參數
- .f
-
一個函數。為了使輸出源易於閱讀,這應該是一個命名函數。
- ...
-
應部分應用
.f
的命名參數。傳遞一個空的
... =
參數來指定未來參數相對於部分化參數的位置。請參閱rlang::call_modify()
了解有關此語法的更多信息。這些點支持準引用。如果取消引用某個值,則該值僅在函數創建時計算一次。否則,每次調用該函數時都會對其進行評估。
- .env
-
現在通過quosures捕獲環境。
- .lazy
- .first
細節
partial()
創建一個采用 ...
參數的函數。與 compose()
和其他函數運算符(如 negate()
)不同,它不會重用 .f
的函數簽名。這是因為 partial()
明確支持在其參數上使用 substitute()
的 NSE 函數。支持這些的唯一方法是通過點來轉發論點。
其他不支持的模式:
-
無法對同一參數重複調用
partial()
以使用不同的表達式預填充它。 -
無法在預填充參數中引用其他參數。
副詞
該函數稱為副詞,因為它修飾函數(動詞)的效果。如果您想在包中包含創建副詞的函數,請務必閱讀faq-adverbs-export。
也可以看看
其他副詞:auto_browse()
, compose()
, insistently()
, negate()
, possibly()
, quietly()
, safely()
, slowly()
例子
# Partial is designed to replace the use of anonymous functions for
# filling in function arguments. Instead of:
compact1 <- function(x) discard(x, is.null)
# we can write:
compact2 <- partial(discard, .p = is.null)
# partial() works fine with functions that do non-standard
# evaluation
my_long_variable <- 1:10
plot2 <- partial(plot, my_long_variable)
plot2()
plot2(runif(10), type = "l")
# Note that you currently can't partialise arguments multiple times:
my_mean <- partial(mean, na.rm = TRUE)
my_mean <- partial(my_mean, na.rm = FALSE)
try(my_mean(1:10))
#> Error in mean.default(na.rm = TRUE, ...) :
#> formal argument "na.rm" matched by multiple actual arguments
# The evaluation of arguments normally occurs "lazily". Concretely,
# this means that arguments are repeatedly evaluated across invocations:
f <- partial(runif, n = rpois(1, 5))
f
#> <partialised>
#> function (...)
#> runif(n = rpois(1, 5), ...)
#> <environment: 0x564146fc9140>
f()
#> [1] 0.52365044 0.83706173 0.03350404 0.04332844 0.79210294
f()
#> [1] 0.06879545 0.86444107 0.07708986
# You can unquote an argument to fix it to a particular value.
# Unquoted arguments are evaluated only once when the function is created:
f <- partial(runif, n = !!rpois(1, 5))
f
#> <partialised>
#> function (...)
#> runif(n = 4L, ...)
#> <environment: 0x564146fc9140>
f()
#> [1] 0.9736226 0.5709573 0.7544066 0.2424543
f()
#> [1] 0.6271579 0.1684146 0.4447896 0.1646752
# By default, partialised arguments are passed before new ones:
my_list <- partial(list, 1, 2)
my_list("foo")
#> [[1]]
#> [1] 1
#>
#> [[2]]
#> [1] 2
#>
#> [[3]]
#> [1] "foo"
#>
# Control the position of these arguments by passing an empty
# `... = ` argument:
my_list <- partial(list, 1, ... = , 2)
my_list("foo")
#> [[1]]
#> [1] 1
#>
#> [[2]]
#> [1] "foo"
#>
#> [[3]]
#> [1] 2
#>
相關用法
- R purrr pluck 安全地獲取或設置嵌套數據結構深處的元素
- R purrr pmap 同時映射多個輸入(“並行”)
- R purrr possibly 包裝函數以返回值而不是錯誤
- R purrr pluck_depth 計算向量的深度
- R purrr accumulate 累積向量縮減的中間結果
- R purrr imap 將函數應用於向量的每個元素及其索引
- R purrr list_transpose 轉置列表
- R purrr as_vector 將列表強製轉換為向量
- R purrr map_if 有條件地將函數應用於向量的每個元素
- R purrr map2 映射兩個輸入
- R purrr array-coercion 強製數組列出
- R purrr auto_browse 包裝一個函數,以便在出錯時自動 browser()
- R purrr insistently 將函數轉換為等待,然後在錯誤後重試
- R purrr map_depth 在給定深度映射/修改元素
- R purrr list_simplify 將列表簡化為原子或 S3 向量
- R purrr rerun 多次重新運行表達式
- R purrr quietly 包裝一個函數來捕獲副作用
- R purrr list_flatten 壓平列表
- R purrr head_while 查找全部滿足謂詞的頭/尾。
- R purrr rbernoulli 從伯努利分布生成隨機樣本
- R purrr rate-helpers 創建延遲率設置
- R purrr keep_at 根據元素的名稱/位置保留/丟棄元素
- R purrr keep 根據元素的值保留/丟棄元素
- R purrr transpose 轉置列表。
- R purrr flatten 將列表的列表展平為簡單的向量
注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Partially apply a function, filling in some arguments。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。