2011-04-26 28 views
20

Tôi muốn đưa ra một tham số params cho một hàm và sau đó đính kèm nó để tôi có thể sử dụng thay vì params $ a everytime tôi tham khảo phần tử danh sách a.attach() bên trong hàm

run.simulation<-function(model,params){ 
attach(params) 
# 
# Use elements of params as parameters in a simulation 
detach(params) 
} 

Có vấn đề gì với điều này không? Nếu tôi đã định nghĩa một biến toàn cầu có tên là c và cũng đã định nghĩa một phần tử có tên c của danh sách "params", giá trị của nó sẽ được sử dụng sau khi lệnh đính kèm?

Trả lời

25

Noah đã chỉ ra rằng việc sử dụng đính kèm là một ý tưởng tồi, mặc dù bạn thấy nó trong một số ví dụ và sách. Có một cách xung quanh. Bạn có thể sử dụng "đính kèm cục bộ" được gọi là with. Trong ví dụ giả của Noah, mẫu này trông giống như

with(params, print(a)) 

sẽ mang lại kết quả giống hệt nhau, nhưng gọn gàng hơn.

+4

+1 Worth giải thích những gì 'với()' và 'trong()' làm. Trong ví dụ được đưa ra, 'with()' tạo một môi trường từ 'params' và sau đó đánh giá biểu thức' print (a) '_inside_ môi trường đó. Do đó các thành phần của 'params' được hiển thị khi biểu thức được đánh giá, mà không cần phải' attach() 'chúng. –

+0

Cảm ơn bạn rất nhiều vì những câu trả lời sáng suốt. –

+0

Vì vậy, những gì làm việc cuối cùng là 'myFun <-function (mô hình, params) {với (params), {...}}' trong đó ... là cơ quan chức năng –

8

Cách dễ nhất để giải quyết vấn đề phạm vi như thế này thường là để thử một cái gì đó đơn giản ra:

a = 1 
params = c() 
params$a = 2 
myfun <- function(params) { 
    attach(params) 
    print(a) 
    detach(params) 
} 
myfun(params) 

Đối tượng sau đây (s) được đeo mặt nạ _by_ .GlobalEnv:

a

# [1] 1 

Như bạn có thể thấy, R đang chọn e thuộc tính toàn cầu a tại đây. Bạn có thể tránh sử dụng attachdetach bất cứ khi nào có thể - phạm vi kết thúc là khó xử lý (tình cờ, tốt nhất là tránh đặt tên biến c - R thường sẽ tìm ra những gì bạn đang đề cập nhưng, có rất nhiều chữ cái khác ngoài kia, tại sao lại mạo hiểm?). Ngoài ra, tôi tìm thấy mã bằng cách sử dụng đính kèm/tách hầu như không thể giải mã.

6

Một khả năng khác là:

run.simulation <- function(model, params){ 
    # Assume params is a list of parameters from 
    # "params <- list(name1=value1, name2=value2, etc.)" 
    for (v in 1:length(params)) assign(names(params)[v], params[[v]]) 
    # Use elements of params as parameters in a simulation 
} 
Các vấn đề liên quan