2011-09-02 26 views
12

這太瘋狂了,只是出於對知識的好奇:我可以在R中運行一個函數,以便在函數完成後我可以獲取函數執行時創建的所有變量嗎?那麼在返回之前能夠查看一個函數的能力呢?我不是說在調試模式下進入該功能。R - 獲得函數調用創建的所有變量

+0

是'LS()'在功能結束不足?你是說你想要在函數內部或函數外部獲取變量列表嗎? – kohske

+0

我沒有這個函數的源碼,所以我不能把ls放在裏面。想象一下,我想對其中一個基本庫中的函數執行此操作。 – SFun28

回答

18

我不確定這是你想要的,但也許很接近。 您可以嵌入由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

輝煌。 「如果沒有,只有如何。」 – Marek

+0

非常酷。謝謝! – SFun28

0

這是那種你正在尋找的東西?

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

或者你可能想要一個你得到每個組件的列表。

1

要獲得一個列表中,您可以使用此示例中的函數的最後一行的所有變量及其值:

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 

輸出:

$a 
[1] "lolcat" 

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

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