在R中,您如何评估...在调用函数中?

时间:2010-08-09 16:37:36

标签: r environment callstack

如果我想知道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())返回<...>,看起来很有希望,但我无法弄清楚如何从中提取任何有用的内容。

eval(list(...), envir = parent.frame())引发错误,声称...使用不正确。

如何从...检索bar

3 个答案:

答案 0 :(得分:3)

想出来。我需要evalsubstitute的组合。 baz应定义为

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

答案 1 :(得分:1)

这应该有效:

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")

答案 2 :(得分:1)

总之:不要。试图重新定义R的范围规则只会导致痛苦和痛苦。