2011-09-02 41 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