2011-09-02 9 views
12

Questo è pazzesco, e solo per curiosità intellettuale: Posso eseguire una funzione in R in modo tale che dopo il completamento della funzione posso ottenere tutte le variabili create quando la funzione viene eseguita? Quindi, la capacità di esaminare una funzione appena prima di tornare? Non intendo entrare nella funzione in modalità di debug.R - ottieni tutte le variabili create dalla funzione chiama

+0

è 'ls()' al fine della funzione insufficiente? Vuoi dire che vuoi ottenere la lista delle variabili all'interno della funzione o al di fuori della funzione? – kohske

+0

Non ho il sorgente per la funzione, quindi non posso inserire ls all'interno di esso. Immagina di voler eseguire questa operazione su una funzione in una delle librerie di base. – SFun28

risposta

18

Non sono sicuro se questo è quello che vuoi, ma forse vicino. È possibile incorporare un'espressione arbitrale nelle funzioni esistenti 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. "Non c'è se, solo come." – Marek

+0

Molto interessante. Grazie! – SFun28

0

È questo il genere di cose che stai cercando?

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

O forse si vuole una lista in cui si 'get' ogni componente.

1

Per ottenere tutte le variabili ed i loro valori come un elenco si potrebbe usare l'ultima riga della funzione in questo esempio:

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 

uscita:

$a 
[1] "lolcat" 

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

$d 
$d$someName 
[1] 10 11 12 13 
Problemi correlati