我们可以使用purrr::partial
创建部分函数:
f <- function(x, y) {
print(x)
print(y)
return(invisible())
}
ff <- purrr::partial(f, y = 1)
ff(2)
#> [1] 2
#> [1] 1
由reprex package(v0.3.0)在2020-02-19创建
这通常可能非常有用,但不幸的是,部分函数失去了它的签名,这被省略号所代替:
ff
#> <partialised>
#> function (...)
#> f(y = 1, ...)
尽管在程序上不相关,但是这会导致开发过程中的代码易读性下降,RStudio的“智能”不再能帮助我们记住参数的名称和/或顺序。那么,还有其他一些保留原始签名的方法(减去了不完整的参数),如下所示?
ff
#> <partialised>
#> function (x)
#> f(y = 1, x)
现在,很明显,这可以通过定义新函数ff
来手动完成,该函数只是带有所需参数的f
的包装。
ff <- function(x) f(x, y = 1)
但是这意味着对f
签名的任何修改都必须复制到ff
。那么,在保留签名的情况下是否存在一种“更清洁”的分区方式?
一个选项是使用rlang::fn_fmls()
显式给函数参数提供默认值:
# If desired, create a copy of the function first: ff <- f
rlang::fn_fmls(f) <- purrr::list_modify( rlang::fn_fmls(f), y=1 )
args(f)
# function (x, y = 1)
f(2)
# [1] 2
# [1] 1