【发布时间】:2016-07-19 07:51:22
【问题描述】:
我正在尝试创建一个函数,其中默认参数由仅临时存在于环境中的变量给出,例如:
arg=1:10
test=function(x=arg[3]){2*x}
> test()
[1] 6
只要函数环境中存在 arg,上述方法就可以正常工作。但是,如果我删除 arg:
> rm(arg)
> test()
> Error in test() : object 'arg' not found
有没有一种方法可以将默认参数设为 3,即使 arg 不再存在?我感觉正确的答案涉及 eval、quote 和/或替代的一些混合,但我似乎找不到正确的咒语。
【问题讨论】:
-
你想达到什么目的?如果你想从全局环境中删除
arg,你可以更改test的environment并在其中指定arg--environment(test) = new.env(); environment(test)$arg = 1:10。 -
有一些路由可以实现类似的行为,但我想我只是想知道参数的值是否可以静态评估。在极端情况下,我可以清楚地将所有内容写成脚本(arg 的第三个元素显式评估为 3 并设置为 x 的默认值)并将其作为源代码。有没有办法完全在 R 环境中实现这一点?
-
您可以
eval参数并使用"formals<-"重新分配它们——例如formals(test)$x = eval(formals(test)$x)。您还可以创建一个中间函数来评估其参数并返回一个带有已评估参数的函数。 -
谢谢——这让我走上了正轨。我已经在最后发布了我的解决方案。