2011-09-02 5 views
12

Esto es una locura, y solo por curiosidad intelectual: ¿Puedo ejecutar una función en R de tal manera que después de que la función se complete puedo obtener todas las variables creadas cuando se ejecuta la función? Entonces, ¿la posibilidad de buscar una función justo antes de que volviera? No me refiero a ingresar a la función en modo de depuración.R - obtener todas las variables creadas desde la llamada de función

+0

es 'ls()' en el fin de la función insuficiente? ¿Quiere decir que quiere obtener la lista de variables dentro de la función o fuera de ella? – kohske

+0

No tengo la fuente para la función, así que no puedo poner ls dentro de ella. Imagine que quiero realizar esta operación en una función en una de las bibliotecas base. – SFun28

Respuesta

18

No estoy seguro de si esto es lo que quiere, pero tal vez cercano. Puede incrustar una expresión de arbitraje en las funciones existentes por trace:

> trace(lm, exit = function().last_env <<- parent.frame()) 
Tracing function "lm" in package "stats" 
[1] "lm" 
> lm(y~x, data.frame(x=1:10, y=10:1)) 
Tracing lm(y ~ x, data.frame(x = 1:10, y = 10:1)) on exit 

Call: 
lm(formula = y ~ x, data = data.frame(x = 1:10, y = 10:1)) 

Coefficients: 
(Intercept)   x 
     11   -1 

> ls(.last_env) 
[1] "cl"   "contrasts" "data"  "formula"  "m"   "method"  "mf"   "model"  "mt"   "na.action" "offset"  
[12] "qr"   "ret.x"  "ret.y"  "singular.ok" "subset"  "w"   "weights"  "x"   "y"   "z"   
> get("cl", .last_env) 
lm(formula = y ~ x, data = data.frame(x = 1:10, y = 10:1)) 
+0

Brillante. "No hay si. Solo cómo". – Marek

+0

Muy bueno. ¡Gracias! – SFun28

0

Es este el tipo de cosas que busca?

> fjj <- function() { x <- 3; y <- 4; ls(environment())} 
> fjj() 
[1] "x" "y" 

O tal vez desee una lista donde 'obtenga' cada componente.

1

Para obtener todas las variables y sus valores como una lista que podría utilizar la última línea de la función en este ejemplo:

myFunction=function(){ 
    a="lolcat" 
    b=data.frame(firstCol=1:3,secondCol=letters[1:3]) 
    d=list() 
    d[["someName"]]=10:13 
    sapply(ls(),function(x)get(x),simplify=F,USE.NAMES=T) 
} 

myResults=myFunction() 

myResults 

de salida:

$a 
[1] "lolcat" 

$b 
    firstCol secondCol 
1  1   a 
2  2   b 
3  3   c 

$d 
$d$someName 
[1] 10 11 12 13 
Cuestiones relacionadas