保留其签名的部分函数

问题描述 投票:3回答:1

我们可以使用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。那么,在保留签名的情况下是否存在一种“更清洁”的分区方式?

r currying partial-application
1个回答
1
投票

一个选项是使用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
© www.soinside.com 2019 - 2024. All rights reserved.