2010-09-07 140 views
6

我正在使用包glmulti將模型擬合到多個數據集。如果我一次適合一個數據集,一切都可以正常工作。爲什麼我不能將數據集傳遞給函數?

因此,例如:

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

的作品就好了。

但是,如果我創建一個包裝的功能,像這樣:

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

根本不起作用。我得到的錯誤是

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

除非有一個名爲dat的數據幀,否則它不起作用。如果我使用results=lapply(list_of_datasets, analyze),它不起作用。 那麼給了什麼?沒有我說的包裝,我不能通過這個函數來獲取數據集列表。如果任何人對這種情況發生的原因或想法有所瞭解或想法,那就太好了。

例子2:

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

工作正常。因此,從某種意義上說,它忽略了參數,只是在尋找名爲dat的數據幀。無論我稱之爲什麼,它的表現都是一樣的。

回答

8

我想這是 - 可是問題另一人由於在S4方法解析樹環境的定義(爲什麼我不是S4的大風扇的resons之一...)

它可以

> 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 

你應該首先將這個信息發送到包的維護者,因爲他們知道他們是如何處理國內的環境:通過添加圍繞DAT報價顯示。他們將不得不調整功能。

對於自己而言,非常髒的解決方法是將「dat」放入全局環境中,然後將其刪除。

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) 
} 

編輯: 只是爲了清楚起見,這實在是對最壞的解決方案成爲可能,但我不能設法找到更好的東西。如果有人給你一個解決方案,你不需要觸及你的全球環境,那麼一定要用那個解決方案。

+0

非常感謝Joris。我真的必須坐下來研究S4方法。至少現在我可以看到這種解決方法的行爲。乾杯。 – Maiasaura 2010-09-07 19:38:01

+0

只要在工作區中沒有名爲「dat」的對象,它就表現良好。如果是這樣,那個將被assign()函數覆蓋。這是你一定要避免的...... – 2010-09-07 19:43:37

+1

不是S4和.GlobalEnv再次:拍額頭:。 – 2010-09-09 10:46:10

相關問題