2011-04-22 8 views
31

Estoy tratando de obtener los nombres de los argumentos en el entorno global dentro de una función. Sé que puedo usar el sustituto para obtener el nombre de los argumentos nombrados, pero me gustaría poder hacer lo mismo con ... argumentos. Lo logré para el primer elemento de ... pero no sé cómo hacerlo para el resto de los elementos. Alguna idea de cómo hacer que esto funcione según lo previsto.usando sustituto para obtener el nombre de argumento con

foo <- function(a,...) 
{ 
    print(substitute(a)) 
    print(eval(enquote(substitute(...)))) 
    print(sapply(list(...),function(x) eval(enquote(substitute(x)),env=.GlobalEnv))) 
} 

x <- 1 
y <- 2 
z <- 3 
foo(x,y,z) 

x 
y 
[[1]] 
X[[1L]] 

[[2]] 
X[[2L]] 

Respuesta

54

La expresión canónica aquí es deparse(substitute(foo)), pero el procesamiento de las necesidades ... ligeramente diferente. Esto es una modificación que hace lo que quiere:

foo <- function(a, ...) { 
    arg <- deparse(substitute(a)) 
    dots <- substitute(list(...))[-1] 
    c(arg, sapply(dots, deparse)) 
} 

x <- 1 
y <- 2 
z <- 3 

> foo(x,y,z) 
[1] "x" "y" "z" 
+0

buena solución limpia, gracias – darckeen

22

Me gustaría ir con

foo <- function(a, ...) { 
print(n <- sapply(as.list(substitute(list(...)))[-1L], deparse)) 
    n 
} 

Entonces

foo(x,y,z) 
# [1] "y" "z" 

pregunta relacionada estaba previamente en StackOverflow: How to use R's ellipsis feature when writing your own function? vale la pena leer.


segunda solución, usando match.call

foo <- function(a, ...) { 
    sapply(match.call(expand.dots=TRUE)[-1], deparse) 
} 
+0

gracias por el enlace – darckeen

+0

Niza uso de 'match.call()' - No estaba al tanto del argumento 'expand.dots'. –

+1

Tarde a la fiesta, pero 'names (sapply (match.call(), deparse)) [- 1]' funcionó para mi caso de uso de obtener un vector de caracteres de nombres de argumento (el [-1] elimina el nombre de la función en sí) – sckott

Cuestiones relacionadas