部分函数应用程序允许您通过预填充一些参数来修改函数。它与泛函和其他函数运算符结合使用特别有用。
参数
- .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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。