【问题标题】:Inherit R function argument from global variable从全局变量继承 R 函数参数
【发布时间】: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,你可以更改testenvironment 并在其中指定arg -- environment(test) = new.env(); environment(test)$arg = 1:10
  • 有一些路由可以实现类似的行为,但我想我只是想知道参数的值是否可以静态评估。在极端情况下,我可以清楚地将所有内容写成脚本(arg 的第三个元素显式评估为 3 并设置为 x 的默认值)并将其作为源代码。有没有办法完全在 R 环境中实现这一点?
  • 您可以eval 参数并使用"formals<-" 重新分配它们——例如formals(test)$x = eval(formals(test)$x)。您还可以创建一个中间函数来评估其参数并返回一个带有已评估参数的函数。
  • 谢谢——这让我走上了正轨。我已经在最后发布了我的解决方案。

标签: r function arguments


【解决方案1】:

在我看来,正确的做法是:

test <- function(x=3) { 2 *x }

然后用参数调用它:

arg<-1:10
test(arg[3])

这样默认值为 3,然后你在运行时传递你想要的参数,如果你在没有参数 test() 的情况下调用它,它将使用默认值。

【讨论】:

    【解决方案2】:

    上面的帖子让我走上了正轨。使用形式:

    arg=1:10
    test=function(x){x*2}
    formals(test)$x=eval(arg[3])
    rm(arg)
    test()
    

    [1] 6

    这就是我想要实现的目标。

    【讨论】:

      猜你喜欢
      • 2016-03-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 2013-08-07
      • 2014-04-20
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多