Наткнулся на этот вопрос в поисках чего-то связанного. Хотя я понимаю, что этому уже несколько лет, ответы кажутся неудовлетворительными, и, похоже, нет готового решения вопроса.
Это можно сделать (безвкусный) обходной путь, используя комбинацию из 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