2010-09-07 27 views
6

Tôi đang sử dụng gói glmulti để phù hợp với các mô hình cho một số bộ dữ liệu. Mọi thứ hoạt động nếu tôi phù hợp với một tập dữ liệu tại một thời điểm.Tại sao tôi không thể chuyển tập dữ liệu sang một hàm?

Vì vậy, ví dụ:

output <- glmulti(y~x1+x2,data=dat,fitfunction=lm) 

công trình tốt.

Tuy nhiên, nếu tôi có thể tạo một hàm wrapper như vậy:

analyze <- function(dat) 
{ 
out<- glmulti(y~x1+x2,data=dat,fitfunction=lm) 
return (out) 
} 

chỉ đơn giản không hoạt động. Lỗi tôi nhận được là

error in evaluating the argument 'data' in selecting a method for function 'glmulti' 

Trừ khi có khung dữ liệu có tên dat, nó không hoạt động. Nếu tôi sử dụng results=lapply(list_of_datasets, analyze), nó không hoạt động. Vì vậy, những gì cho? Nếu không có trình bao bọc nói của tôi, tôi không thể lapply một danh sách các bộ dữ liệu thông qua chức năng này. Nếu bất cứ ai có suy nghĩ hoặc ý tưởng về lý do tại sao điều này xảy ra hoặc làm thế nào tôi có thể có được xung quanh nó, đó sẽ là tuyệt vời.

dụ 2:

dat=list_of_data[[1]] 
analyze(dat) 

hoạt động tốt. Vì vậy, theo một nghĩa nào đó, nó bỏ qua đối số và chỉ tìm kiếm một khung dữ liệu có tên là dat. Nó cư xử giống nhau bất kể tôi gọi nó là gì.

Trả lời

8

Tôi đoán đây là -yet another- vấn đề do sự định nghĩa về môi trường trong cây phân tích cú pháp các phương pháp S4 (một trong những resons tại sao tôi không phải là một fan hâm mộ lớn của S4 ...)

Nó có thể được hiển thị bằng cách thêm dấu ngoặc kép xung quanh địa chỉ:

> analyze <- function(dat) 
+ { 
+ out<- glmulti(y~x1+x2,data="dat",fitfunction=lm) 
+ return (out) 
+ } 
> analyze(test) 
Initialization... 
Error in eval(predvars, data, env) : invalid 'envir' argument 

Bạn nên gửi thông tin này đến người duy trì gói hàng vì họ biết cách họ xử lý môi trường bên trong. Họ sẽ phải điều chỉnh các chức năng.

Một giải pháp rất tốn kém cho bản thân bạn, là đặt "dat" trong môi trường toàn cầu và xóa nó sau đó.

analyze <- function(dat) 
{ 
assign("dat",dat,envir=.GlobalEnv) # put the dat in the global env 
out<- glmulti(y~x1+x2,data=dat,fitfunction=lm) 
remove(dat,envir=.GlobalEnv) # delete dat again from global env 
return (out) 
} 

EDIT: Chỉ cần cho rõ ràng, điều này thực sự là về giải pháp tồi tệ nhất có thể, nhưng tôi không thể quản lý để tìm bất cứ điều gì tốt hơn. Nếu ai đó cung cấp cho bạn một giải pháp mà bạn không phải chạm vào môi trường toàn cầu của bạn, bằng mọi cách, hãy sử dụng nó.

+0

Cảm ơn một tấn Joris. Tôi thực sự phải ngồi xuống và xương lên trên phương pháp S4. Ít nhất là bây giờ tôi có thể thấy cách giải quyết này hoạt động. cổ vũ. – Maiasaura

+0

Nó hoạt động tốt, miễn là bạn không có một đối tượng gọi là "dat" trong vùng làm việc của bạn. Nếu vậy, cái đó sẽ bị ghi đè bởi hàm assign(). Đó là điều bạn chắc chắn muốn tránh ... –

+1

Không phải S4 và .GlobalEnv nữa: tát vào trán:. –

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