Натрапив на це питання під час пошуку чогось пов’язаного. Хоча я усвідомлюю, що цьому вже кілька років, відповіді здаються незадовільними, і, схоже, немає будь-якого готового рішення питання.
Можна зробити (неелегантний) обхідний шлях, використовуючи комбінацію функцій formals
і environment
. Наведений нижче приклад витягує аргументи із середовища за допомогою імен, витягнутих із формалів, а потім додає список багатоточия. Якщо ви хочете, щоб значення були такими, як вони були встановлені під час виклику функції, встановіть для аргументу orig_values значення TRUE. Функція включає лише змінні, явно або явно встановлені під час виклику функції.
allargs <- function(orig_values = FALSE) {
parent_formals <- formals(sys.function(sys.parent(n = 1)))
fnames <- names(parent_formals)
fnames <- fnames[-which(fnames == '...')]
args <- evalq(as.list(environment()), envir = parent.frame())
args <- c(args[fnames], evalq(list(...), envir = parent.frame()))
if(orig_values) {
defargs <- as.list(parent_formals)
defargs <- defargs[unlist(lapply(defargs, FUN = function(x) class(x) != "name"))]
args[names(defargs)] <- defargs
setargs <- evalq(as.list(match.call())[-1], envir = parent.frame())
args[names(setargs)] <- setargs
}
return(args)
}
tempf <- function(a, b = 2, ...) {
d <- 5
b <- 3
cat("Currently set values defined in call or formals\n")
print(allargs())
cat("Values as defined at the time of the call\n")
print(allargs(T))
}
tempf(1, c = 3)
Currently set values defined in call or formals
$a
[1] 1
$b
[1] 3
$c
[1] 3
Values as defined at the time of the call
$a
[1] 1
$b
[1] 2
$c
[1] 3