2010-08-09 5 views
3

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

Выяснил это. Мне нужна комбинация eval и substitute. baz должно быть определено как

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

+1 Это интересный пример. Если у вас есть шанс, было бы неплохо, если бы вы могли обновить это с объяснением * почему * это может потребоваться для многоточия, но не для других переменных? – Shane

+0

@ Шейн: Хороший вопрос. Я собираюсь копать дальше, но это быстро проникает в область плавления мозга. Продолжение следует ... –

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

Спасибо, но что, если я не могу/не хочу изменять 'baz'? Является ли оценка «...» в другой среде возможной? –

+0

Посмотрите мое второе решение? Я не уверен в этом объекте <...>; это класс «...», и это явно не совпадает с оригинальным многоточием. – Shane

1

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

+0

Признается специфический для вас язык выдох (забуференный, поскольку комментарии имеют минимальную длину): Rmen – mdsumner

Смежные вопросы