Я хотел бы иметь возможность передавать именованные объекты в аргументах функции, которые были сопоставлены с многоточием (..., точками AKA), чтобы сделать их общедоступными в среде выполнения этой функции или выполняемых функцийвнутри этой среды, где бы она ни была определена, как если бы там были набраны аргументы.
Я пытался сделать это для функции, вложенной функции, определенной вне этой функции, и вложенной функции, определенной внутри этой функции,использование list2env (), которое должно возвращать элементы списка аргументов в среду parent.frame (), которая, как я понимаю, является вызывающей средой.Таким образом:
# Ellipsis in nested functions
inner_f1<- function(x){list2env(list(...)[-1L]); x + b}
outer_f <- function(x, ...){
list2env(list(...)[-1L])
in01 <- x + a
inner_f2 <- function(x){list2env(list(...)[-1L]); print(ls()); x + c}
in02 <- inner_f2(x)
in03 <- inner_f1(x)
out <- list(in01, in02, in03)
}
outer_f(x=0, a=1, b=2, c=3)
Я пробовал это с и без ... в определениях вложенных функций, но ни одна из них не работает.Желаемым выводом будет:
$ in01
[1] 1
$ in02
[1] 2
$ in03
[1] 3
Файл справки R в разделе "Точки" не предоставляет никакой информации о передаче ... значений внутренним функциям, и единственный способ, в котором упоминается получение информации из ...с помощью метода .. (n).Он ссылается на «Введение в R», но пример par, похоже, неверно предполагает, что внутренней функции достаточно иметь свой собственный…, хотя код par (там не цитируется) получает содержимоеделать сложные вещи для args = list(...)
, и определение языка R также описывает метод list (...).Я не нашел заменитель идиомы (list (...)) [- 1], часто используемый в базовых пакетах R, официально документированный где-либо, но ни в коем случае ни this, ни eval (заменитель (alist (...)))) из "Advanced R" :: Нестандартная оценка, кажется, делает то, что я хочу.
Есть много ответов на вопросы о ... и вложенных функциях здесь на stackoverflow, но все 15или так, что я читаю, кажется, более специализированным, чем обобщенный метод, который я ищу.