Stolperte über diese Frage, als ich nach etwas Ähnlichem suchte. Obwohl mir klar ist, dass dies mehrere Jahre alt ist, scheinen die Antworten unbefriedigend zu sein, und es scheint keine Standardlösung für die Frage zu geben.
Es ist möglich, eine (unelegante) Problemumgehung mithilfe einer Kombination der Funktionen formals
und environment
durchzuführen. Im folgenden Beispiel werden Argumente aus der Umgebung mithilfe von Namen extrahiert, die aus Formalen extrahiert wurden, und anschließend wird die Ellipsenliste angehängt. Wenn Sie die Werte so haben möchten, wie sie zum Zeitpunkt des Funktionsaufrufs festgelegt wurden, setzen Sie das Argument orig_values auf TRUE. Die Funktion enthält nur Variablen, die beim Funktionsaufruf implizit oder explizit festgelegt werden.
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