¿R proporciona un objeto / función / método / palabra clave para obtener todos los argumentos de la función?
Usando un ejemplo:
function(a, b="default", ...)
proporcionaría a
y b
así como ...
dentro del entorno de la función. ¿Hay una declaración similar a la list(...)
que también incluiría a
y b
en el resultado?
O dicho de otra manera: una abreviatura de list(a=a, b=b, ...)
, dadofunction(a, b, ...)
Respuestas:
Creo que quieres
match.call
:tmpfun <- function(a,b,...) { print(as.list(match.call())) print(as.list(match.call(expand.dots=FALSE))) } > tmpfun(a=1, b=2, c=3, d=4) [[1]] tmpfun $a [1] 1 $b [1] 2 $c [1] 3 $d [1] 4 [[1]] tmpfun $a [1] 1 $b [1] 2 $... $...$c [1] 3 $...$d [1] 4
fuente
...
como parámetro)?c(as.list(environment()), list(...))
que captura tanto los argumentos predeterminados como los argumentos proporcionados.Una solución es utilizar:
tempf <- function(a, b = 2, ...) { argg <- c(as.list(environment()), list(...)) print(argg) } tempf(1, c = 3) $a [1] 1 $b [1] 2 $c [1] 3
Esto crea una lista con nombre de los valores de los argumentos.
fuente
...
como parámetro)?argg <- c(as.list(environment()), list(...))
al principio de la función. De lo contrario,environment()
terminará incluyendo otras variables que se crean dentrotempf()
prueba la
args
función¿Cuáles son los argumentos a favor de la
mean
función?> args(mean) function (x, ...) NULL
¿Y la
lm
función?> args(lm) function (formula, data, subset, weights, na.action, method = "qr", model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, contrasts = NULL, offset, ...) NULL
Si desea obtener una lista de argumentos, intente
fuente
Me encontré con esta pregunta mientras buscaba algo relacionado. Si bien me doy cuenta de que esto tiene varios años, las respuestas parecen insatisfactorias y no parece haber ninguna solución estándar para la pregunta.
Es posible hacer una solución alternativa (poco elegante), utilizando una combinación de las funciones
formals
yenvironment
. El siguiente ejemplo extrae argumentos del entorno utilizando nombres extraídos de formales, luego agrega la lista de puntos suspensivos. Si desea tener los valores como se establecieron en el momento de la llamada a la función, establezca el argumento orig_values en TRUE. La función solo incluye variables establecidas implícita o explícitamente en la llamada a la función.allargs <- function(orig_values = FALSE) { # get formals for parent function parent_formals <- formals(sys.function(sys.parent(n = 1))) # Get names of implied arguments fnames <- names(parent_formals) # Remove '...' from list of parameter names if it exists fnames <- fnames[-which(fnames == '...')] # Get currently set values for named variables in the parent frame args <- evalq(as.list(environment()), envir = parent.frame()) # Get the list of variables defined in '...' args <- c(args[fnames], evalq(list(...), envir = parent.frame())) if(orig_values) { # get default 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
fuente
Creo que estas buscando
formals
:formals(sd) $x $na.rm [1] FALSE
Y usar
dput
esto le da el formulario que especifica en la pregunta:dput(formals(sd)) list(x = , na.rm = FALSE)
Tenga en cuenta que
formals
no funciona para funciones primitivas , solo cierres.fuente
test <- function( x = 1, y = 2, ... ) { if(length(list(...)) == 0) { print(as.list(environment())) } else { print(c(as.list(environment()), list(...))) } } test() test(z = 3)
fuente
rlang::fn_fmls
da una solución breve y limpia:library(ggplot2) library(rlang) # action argument_list <- rlang::fn_fmls(fn = geom_point) # evaluate output class(argument_list) #> [1] "pairlist" is.list(argument_list) #> [1] TRUE argument_list #> $mapping #> NULL #> #> $data #> NULL #> #> $stat #> [1] "identity" #> #> $position #> [1] "identity" #> #> $... #> #> #> $na.rm #> [1] FALSE #> #> $show.legend #> [1] NA #> #> $inherit.aes #> [1] TRUE
Creado el 2020-02-25 por el paquete reprex (v0.3.0)
fuente