2010-02-22 17 views
5

Mi pregunta es cómo extraer el nombre de una variable de una función que se llama en otra función en R?¿Cómo se extrae el nombre de una variable en una función que se llama desde otra función en R?

Para ilustrar, aquí es un ejemplo:

a <- function(variable) { 

    print(deparse(substitute(variable))) 

    internala(substitute(variable)) 

} 

internala <- function(variableXX) { 

    namex=deparse(substitute(variableXX)) 

    print(namex) 
} 

Llamar a la función a da el siguiente resultado:

>a(whatever) 

[1] "whatever" 

[1] "substitute(variable)" 

que significa que puedo extraer el nombre de la variable whatever de a, pero no desde internala.

¿Alguna idea de esto?

¡Cualquier ayuda será apreciada!

Maria

+0

Para que quede claro, ¿cuál es el comportamiento que desea? Supongo que quieres 'a (lo que sea)' imprimir 'lo que sea 'dos ​​veces? Si también ejecuta 'internala (lo que sea)' ¿también quiere que la salida sea 'lo que sea '? ¿Qué sucede si llama a foo <- function (b) {a (b)}; foo (bar)? –

+0

sí, lo has adivinado correctamente, quiero una (lo que sea) para imprimir lo que sea dos veces, internala (lo que sea) para imprimir lo que sea, y donde realmente me quedé atrapado es exactamente lo que señalaste, es decir, si tengo otra función foo <- (b) {a (b)}, me gustaría foo (barra) para imprimir la barra dos veces. ¿Está claro? ¿Tienes alguna idea de cómo hacer esto? tnx mucho! maria – Maria

+0

Según el último caso, parece que desea expandir la expresión hasta la llamada de nivel superior, pero no más? Entonces, si también hubiera foo2 <- function (b) {foo (b + 1)}, ¿querrías que foo2 (bar) imprimiera bar + 1 dos veces? –

Respuesta

3

Usted podría cambiar a función de sustituir el argumento de una función internala y eval que:

a <- function(variable) { 
    print(deparse(substitute(variable))) 
    eval(substitute(internala(variable))) # this is only change 
} 

internala <- function(variableXX) { 
    namex=deparse(substitute(variableXX)) 
    print(namex) 
} 

a(whatever) 

Como Hadley sugieren que es mejor pasar directamente nombres. Normalmente hago algo como eso:

a <- function(variable, vname=deparse(substitute(variable))) { 
    print(vname) 
    internala(variable, vname) 
} 

internala <- function(variableXX, namex=deparse(substitute(variableXX))) { 
    print(namex) 
} 

a(whatever) 

Cada función puede ser llamada sin pasar el nombre, pero puede anularla. Por ejemplo:

a(whatever, "othername") 
1

Aquí hay algo que funciona para mí. Sin embargo no estoy seguro si esto es la solución óptima

a <- function(variable) { 
print(deparse(substitute(variable))) 
my_command <- paste('internala(',substitute(variable),')',sep = '') 
eval(parse(text = my_command)) 
} 

internala <- function(variableXX) { 
namex=deparse(substitute(variableXX)) 
print(namex) 
} 
+0

Voto a favor porque parece ser el truco a excepción de dos objeciones menores: 1.) debe dejar el suplente, de lo contrario recibirá un error si llama a (b + 1). 2.) en base a los comentarios de Maria, deberás subir los cuadros principales también. –

6

Es mejor no jugar un poco con sustituto y amigos - que son propensos a crear una función que va a ser muy difícil de programar en contra. ¿Por qué no simplemente pasar el nombre de la variable explícitamente como una cadena?

+0

Definitivamente; trabajar con nombres de cadenas es mucho más directo. – Shane

+0

Esto fue útil (gracias), pero dentro de la función tuve que hacer 'var <- get (var_as_string)'. – drstevok

Cuestiones relacionadas