2010-11-05 12 views
14

Pregunta súper rápida ...¿Argumentar argumento de función como una cadena de caracteres?

¿Cómo se toma el argumento de una función en particular (definido por el usuario) y se emite como una cadena de caracteres?

Si por un simple ejemplo,

foo <- function(x) { ... } 

Quiero devuelva el nombre del objeto x. Así,

foo(testing123) 

vuelve "testing123" (y testing123 solo podría ser algún vector numérico aleatorio)

disculpas si esta pregunta se ha hecho antes - buscado, pero no pudieron encontrar! ¡¡Gracias!!

Respuesta

31
foo <- function(x) deparse(substitute(x)) 
2

¡Vaya, al parecer, yo no busca lo suficiente ...

foo <- function(x) {return(as.character(substitute(x)))} 

Bueno, eso es fácil ...

+0

'deparse (sustituto (x))' sería la forma habitual de hacerlo, según la respuesta de JD. Compare su versión con JD en este 'foo (testing * bar)' para ver por qué. –

+0

¡Sí! Me di cuenta de esto. 'deparse' es el camino a seguir. Gracias por la confirmación. – Ray

+3

si está contento con la respuesta de JD, asegúrese de aceptarla así que i) JD obtiene algún representante y ii) otros usuarios que leen la Q saben que esto respondió su Q –

17

Meta-respuesta: si sabe R hace algo y desea para hacerlo, verifica la fuente. Por ejemplo, puede haber detectado que plot(foo) pega 'foo' en el ylab, por lo que la trama puede hacerlo. ¿Cómo? Comience mirando el código:

> plot 
function (x, y, ...) 
{ 
    if (is.function(x) && is.null(attr(x, "class"))) { 
     if (missing(y)) 
      y <- NULL 
     hasylab <- function(...) !all(is.na(pmatch(names(list(...)), 
      "ylab"))) 
     if (hasylab(...)) 
      plot.function(x, y, ...) 
     else plot.function(x, y, ylab = paste(deparse(substitute(x)), 
      "(x)"), ...) 
    } 
    else UseMethod("plot") 
} 

Y hay algo de magia deparse(substitute(x)).

+0

No estoy seguro de si realmente importa, ya que la respuesta es genial, pero 'plot' ya no se ve así –

+0

@Spacedman: ¡este es un muy buen punto! – theforestecologist

Cuestiones relacionadas