В R, как вы оцениваете ... в вызывающей функции? - PullRequest
3 голосов
/ 09 августа 2010

Если я хочу узнать, что хранится в аргументе ... в функции 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 ]

3 голосов
/ 09 августа 2010

Разобрался.Мне нужно было сочетание eval и substitute.baz должно быть определено как

baz <- function()
{ 
  dots <- eval(substitute(list(...), env = parent.frame()))
  print(dots)
}
1 голос
/ 13 августа 2010

Одним словом: не надо.Попытка переопределить правила определения содержания R, скорее всего, закончится душевной болью и болью.

1 голос
/ 09 августа 2010

Это должно работать:

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