r - “更新”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
更改。
解决方案
您可以只创建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
参数调用中产生原始值,因此您可以修改该值或其他值,或者也可以在调用中添加新参数。
推荐阅读
- ios - 如何防止 TableView 崩溃?
- javascript - Vue cli 3项目别名src到@或~/不起作用
- ruby-on-rails - 如何使用 Stripe 修复 StatementInvalid 错误
- twitter-bootstrap - 关闭引导警报会导致包含模式也被关闭
- java - 当需要移植 JVM 时,Java 虚拟机在架构上运行 java 的目的是什么?
- python - 如何使用 NLTK 获取多个单词的同义词?
- javascript - Receiving Post data (not form) in Express
- amazon-web-services - 如果 cloudformation 堆栈被删除并且相同的安全组已存在,则重新创建 SecurityGroup
- typescript - How can I extend a TypeScript interface and infer the arguments?
- phpstorm - Select next occurence with IdeaVim in PhpStorm