2012-01-25 41 views
6

Có thể sử dụng env() làm thay thế cho các không gian tên và cách kiểm tra xem có tồn tại môi trường trước khi thêm các chức năng vào không?cách thêm các chức năng vào môi trường hiện tại

này liên quan đến câu hỏi này, và gợi ý Brendan của How to organize large R programs? Tôi hiểu điểm Dirk trong câu hỏi đó, tuy nhiên đối với sự phát triển đó là đôi khi không thực tế để đưa các chức năng trong các gói.

EDIT: Ý tưởng là bắt chước không gian tên trên các tệp và do đó có thể tải các tệp khác nhau một cách độc lập. Nếu một tệp đã được tải trước đó thì môi trường không cần phải được tạo, chỉ cần thêm vào.

Cám ơn ý tưởng

EDIT: Vì vậy, có lẽ mã này dưới đây sẽ tương đương với không gian tên trong các ngôn ngữ khác: -

# how to use environment as namespaces 

# file 1 

# equivalent of 'namespace e' if (!(exists("e") && is.environment(e))) { e <- new.env(parent=baseenv()) } 

e$f1 <- function(x) {1} 


# file 2 
# equivalent of 'namespace e' if (!(exists("e") && is.environment(e))) { e <- new.env(parent=baseenv()) } 

e$f2 <- function(x) {2} 
+3

Tôi tổ chức * nhiều * mã của tôi trong các gói, nhưng sử dụng gói 'devtools' của Hadley để tải nó vào môi trường. Điều này về cơ bản đạt được những gì bạn mô tả, nhưng sau đó tôi cũng có thêm lợi thế mà tôi có thể xây dựng và tái sử dụng gói nếu tôi muốn. (Nói cách khác, tôi không cần phải liên tục xây dựng lại gói trong khi tôi đang phát triển.) – Andrie

Trả lời

2

Bạn có thể kiểm tra xem môi trường tồn tại trong cùng một cách mà bạn sẽ bất kỳ biến khác.

e <- new.env() 
exists("e") && is.environment(e) 
5

Có bạn có thể dành cho hầu hết các phần. Mỗi hàm có một môi trường và đó là nơi mà nó tìm kiếm các hàm khác và các biến toàn cầu. Bằng cách sử dụng môi trường của riêng bạn, bạn có toàn quyền kiểm soát điều đó.

Các chức năng thông thường cũng được gán cho môi trường (bằng cách gán chúng cho một tên) và thường hai môi trường đó giống nhau - nhưng không phải lúc nào. Trong một gói, môi trường không gian tên được sử dụng cho cả hai, nhưng sau đó môi trường gói (khác) trên đường dẫn tìm kiếm cũng có các hàm (xuất) được xác định. Vì vậy, có môi trường khác nhau.

# this will ensure only stats and packages later on the search list are searched for 
# functions from your code (similar to import in a package) 
e <- new.env(parent=as.environment("package:stats")) 

# simple alternative if you want access to everything 
# e <- new.env(parent=globalenv()) 

# Make all functions in "myfile.R" have e as environment 
source("myfile.R", local=e) 

# Or change an existing function to have a new environment: 
e$myfunc <- function(x) sin(x) 
environment(e$myfunc) <- e 

# Alternative one-liner: 
e$myfunc <- local(function(x) sin(x), e) 

# Attach it if you want to be able to call them as usual. 
# Note that this creates a new environment "myenv". 
attach(e, name="myenv") 

# remove all temp objects 
rm(list=ls()) 

# and try your new function: 
myfunc(1:3) 

# Detach when it's time to clean up or reattach an updated version... 
detach("myfile") 

Trong ví dụ trên, e tương ứng với một không gian tên và kèm theo "myenv" tương ứng với một môi trường gói (như "gói: số liệu thống kê" trên con đường tìm kiếm).

4

Không gian tên môi trường, vì vậy bạn có thể sử dụng chính xác cùng một cơ chế. Vì R sử dụng phạm vi từ vựng phụ huynh của môi trường xác định chức năng sẽ thấy (tức là các biến tự do bị ràng buộc như thế nào). Và chính xác như không gian tên bạn có thể đính kèm các môi trường và tìm kiếm chúng.

Vì vậy, để tạo ra một "thủ công không gian tên" mới, bạn có thể sử dụng một cái gì đó giống như

e <- new.env(parent=baseenv()) 
# use local(), sys.source(), source() or e$foo <- assignment to populate it, e.g. 
local({ 
    f <- function() { ... } 
    #... 
}, e) 
attach(e, name = "mySuperNamespace") 

Bây giờ nó được nạp và gắn liền giống như một không gian tên - vì vậy bạn có thể sử dụng f giống như nó đang ở trong một không gian tên. Không gian tên sử dụng một môi trường cha mẹ nhiều hơn để giải quyết nhập khẩu - bạn cũng có thể làm điều đó nếu bạn quan tâm. Nếu bạn cần kiểm tra môi trường thú vị của mình, chỉ cần kiểm tra đường dẫn tìm kiếm, ví dụ: "mySuperNamespace" %in% search(). Nếu bạn cần môi trường thực tế, hãy sử dụng as.environment("mySuperNamespace")

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