【问题标题】:In R, how do you evaluate ... in the calling function?在 R 中,你如何在调用函数中评估 ...?
【发布时间】:2010-08-09 16:37:36
【问题描述】:

如果我想知道 R 函数中 ... 参数中存储的内容,我可以简单地将其转换为列表,就像这样

foo <- function(...)
{
  dots <- list(...)
  print(dots)
}

foo(x = 1, 2, "three")
#$x
#[1] 1
#
#[[2]]
#[1] 2
#
#[[3]]
#[1] "three"

我不知道如何在调用函数中评估...。在下一个示例中,我希望 baz 的内容将 ... 参数返回给 bar

bar <- function(...)
{
  baz()
}

baz <- function()
{ 
  # What should dots be assigned as?
  # I tried                                           
  # dots <- get("...", envir = parent.frame())
  # and variations of
  # dots <- eval(list(...), envir = parent.frame())
  print(dots)
}

bar(x = 1, 2, "three")

get("...", envir = parent.frame()) 返回&lt;...&gt;,看起来很有希望,但我不知道如何从中提取任何有用的东西。

eval(list(...), envir = parent.frame()) 抛出错误,声称... 使用不当。

如何从bar 检索...

【问题讨论】:

    标签: r environment callstack


    【解决方案1】:

    想通了。我需要evalsubstitute 的组合。 baz 应该定义为

    baz <- function()
    { 
      dots <- eval(substitute(list(...), env = parent.frame()))
      print(dots)
    }
    

    【讨论】:

    • +1 这是一个有趣的例子。如果您有机会,如果您可以更新它并解释 为什么 这对于省略号可能是必要的,但对于其他变量不是必需的,那将是很好的?
    • @Shane:一个好问题。我将进一步挖掘,但这正在迅速进入大脑融化的领域。待续……
    【解决方案2】:

    这应该可行:

    bar <- function(...)
    {
      baz(...=...)
    }
    
    baz <- function(...)
    { 
      print(list(...))
    }
    
    bar(x = 1, 2, "three")
    

    只需在子函数中赋值即可。

    或者,您可以将省略号分配为父函数中的列表:

    bar <- function(...)
    {
      bar.x <- list(...)
      baz()
    }
    
    baz <- function()
    { 
      dots <- get("bar.x", envir = parent.frame())
      print(dots)
    }
    
    bar(x = 1, 2, "three")
    

    这是相同的想法,但我不建议这样做,因为您正在覆盖省略号:

    bar <- function(...)
    {
      ... <- list(...)
      baz()
    }
    
    baz <- function()
    { 
      dots <- get("...", envir = parent.frame())
      print(dots)
    }
    
    bar(x = 1, 2, "three")
    

    【讨论】:

    • 谢谢,但是如果我不能/不想修改 baz 怎么办?是否可以在不同的环境中评估 ...
    • 看到我的第二个解决方案了吗?我不确定那个 <...> 对象;它的类是“...”,它显然与原始省略号不同。
    【解决方案3】:

    一句话:不要。试图重新定义 R 的作用域规则只会导致心痛和痛苦。

    【讨论】:

    • 一种特定于语言环境的呼气浮现在脑海中(由于 cmets 有最小长度,因此缓冲):Rmen
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多