2011-09-02 32 views
12

Điều này thật điên rồ và chỉ tò mò trí tuệ: Tôi có thể chạy một hàm theo R theo cách sao cho sau khi hàm hoàn tất tôi có thể nhận tất cả các biến được tạo khi hàm được thực hiện? Vì vậy, khả năng nhìn vào một chức năng ngay trước khi nó trở lại? Tôi không có nghĩa là nhập chức năng vào chế độ gỡ lỗi.R - nhận tất cả các biến được tạo từ cuộc gọi hàm

+0

là 'ls()' tại kết thúc chức năng không đủ? Bạn có nghĩa là bạn muốn nhận danh sách biến bên trong hàm hoặc bên ngoài hàm? – kohske

+0

Tôi không có nguồn chức năng, vì vậy tôi không thể đặt ls bên trong của nó. Hãy tưởng tượng tôi muốn thực hiện thao tác này trên một hàm trong một trong các thư viện cơ sở. – SFun28

Trả lời

18

Tôi không chắc chắn nếu đây là những gì bạn muốn, nhưng có thể đóng. Bạn có thể nhúng một biểu thức trọng tài trong các chức năng hiện có bằng cách 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

Rực rỡ. "Không có nếu. Chỉ làm thế nào." – Marek

+0

Rất tuyệt. cảm ơn! – SFun28

0

Đây có phải là loại điều bạn đang tìm kiếm?

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

Hoặc có thể bạn sẽ muốn danh sách nơi bạn nhận được 'từng thành phần.

1

Để có được tất cả các biến và giá trị của họ như là một danh sách mà bạn có thể sử dụng dòng cuối cùng của hàm trong ví dụ này:

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 

Output:

$a 
[1] "lolcat" 

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

$d 
$d$someName 
[1] 10 11 12 13 
Các vấn đề liên quan