2011-11-02 27 views
6

Làm cách nào để đảm bảo rằng khi một hàm được gọi là nó không được phép lấy các biến từ môi trường toàn cầu?cách tách một hàm

Tôi muốn mã sau đây cung cấp cho tôi lỗi. Lý do là vì tôi có thể đã gõ sai z (tôi muốn gõ y).

z <- 10 
temp <- function(x,y) { 
     y <- y + 2 
     return(x+z) 
} 
> temp(2,1) 
[1] 12 

Tôi đoán câu trả lời có liên quan đến môi trường, nhưng tôi chưa hiểu chúng.

Có cách nào để đặt mặc định cho hành vi mong muốn của tôi (ví dụ: bằng cách đặt tùy chọn) không?

+1

Có một số cuộc thảo luận trong mục tin tức ngày 27 tháng 2 năm 2010 trên trang chủ proto: http://r-proto.googlecode.com. –

+0

@ G.Gothendieck cảm ơn bạn, có vẻ thú vị. Tôi không chắc tôi có cảm thấy như đang đào sâu vào một gói lớn/thay đổi triết lý chưa. Nhưng tôi sẽ ghi nhớ điều này khi tôi có thêm kinh nghiệm. –

+0

Tôi khá chắc chắn điều này đã được yêu cầu ở đây. – hadley

Trả lời

4
> library(codetools) 
> checkUsage(temp) 
<anonymous>: no visible binding for global variable 'z' 

Chức năng không thay đổi, vì vậy không cần phải kiểm tra nó mỗi khi được sử dụng. findGlobals tổng quát hơn và khó hiểu hơn một chút. Một cái gì đó giống như

có thể truy cập tất cả các chức năng trong môi trường, có thể đã đến lúc nghĩ về viết một gói (không khó).

+0

cảm ơn! Điều đó trông giống như một chức năng tuyệt vời. Tuy nhiên, bạn vẫn phải lo lắng về môi trường nó xuất hiện. tức là, nếu tôi sao chép và chèn tất cả các mã trong bài viết gốc của tôi và sau đó chạy 'checkUsage (temp)' nó sẽ không báo cáo lỗi. Tôi chỉ cần sao chép hàm 'temp'. –

+0

xem 'findGlobals' và trang trợ giúp cho gói. –

+0

ok Tôi sẽ kiểm tra điều đó. Làm thế nào tôi có thể chạy checkUsage trên tất cả các hàm trong ls()? Hoặc nếu đó là khó khăn, giả sử có chỉ có chức năng đầu ra bởi ls(), làm thế nào tôi có thể chạy checkUsage trên tất cả chúng? Tôi đã thử 'lapply (ls(), FUN = checkUsage)' nhưng điều đó không hiệu quả. –

5
environment(temp) = baseenv() 

Xem thêm http://cran.r-project.org/doc/manuals/R-lang.html#Scope-of-variables?environment.

+0

Nó sẽ che dấu tất cả các biến nhưng trong môi trường cơ sở. tức là, các gói bổ sung không có sẵn trong 'temp'. – kohske

+0

và cách tôi che dấu mọi thứ ngoại trừ 'base' và, ví dụ, gói' plyr'? –

+0

Không chắc chắn nhưng có thể 'môi trường (tạm thời) <- new.env (parent = as.environment (search() [2]))' sẽ chỉ che khuất môi trường toàn cục. – kohske

1
environment(fun) = parent.env(environment(fun)) 

(Tôi đang sử dụng 'vui vẻ' ở vị trí của tên hàm của bạn 'tạm thời' cho rõ ràng)

này sẽ loại bỏ các "không gian làm việc" môi trường (.GlobalEnv) từ đường dẫn tìm kiếm và để lại tất cả mọi thứ khác (ví dụ như tất cả các gói).

+0

cảm ơn bạn! Tôi sẽ thử điều này trong lần tới. –

Các vấn đề liên quan