首页 > 解决方案 > “更新”R中用户定义函数中的一些参数

问题描述

假设我们在 R 中有一个用户定义的函数,其中有许多(> 20)个函数参数。这些参数都没有预定义的标准值(例如 arg1 = 10)。

简化示例:

foo <- function(value, increment){
        value + increment
}

bar <- foo(value = 2, increment = 3)
bar
#> [1] 5

reprex 包(v0.2.1)于 2019 年 3 月 25 日创建

问题:有没有办法一次“更新”一个/几个参数,同时保持所有其他参数的输入不变?对于上面的示例,这将类似于:

update(bar, increment = 8)
#> [1] 10

请注意,这里value = 2已经为对象指定了它bar并且只会increment更改。

标签: rfunction

解决方案


您可以只创建call对象并对其进行修改:

library(pryr)

cl <- call("foo",value = 2,increment = 3)
eval(cl) #5

cl_new <- modify_call(cl,list(increment = 8))
eval(cl_new) #10

这里我使用了pryr包和它的modify_call函数,但是如果你检查那个函数的代码,你会发现自己实现一个简单的版本是相当简单的。

基本上,cl[["increment"]]将在increment参数调用中产生原始值,因此您可以修改该值或其他值,或者也可以在调用中添加新参数。


推荐阅读