2010-09-07 28 views
6

Modelleri çeşitli veri kümelerine uyacak şekilde glmulti paketini kullanıyorum. Her seferinde bir veri kümesine uyduğumda her şey çalışır. Örneğin bu şekildeNeden bir veri kümesini bir işleve geçiremiyorum?

:

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

inşaat iyi. Ben şöyle bir sarıcı işlev oluşturursanız

Ancak:

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

basitçe çalışmaz. Aldığım hata, dat adlı bir veri çerçevesi olmadıkça, çalışmazsa, results=lapply(list_of_datasets, analyze) kullanırsam, işe yaramıyor. Peki ne veriyor? Sözüm sarıcı olmadan, bu işlev aracılığıyla veri kümelerinin bir listesini yapamıyorum. Eğer bunun neden olduğuna dair düşünceleri veya fikirleri varsa veya etrafta nasıl geçebileceğimiz varsa, bu harika olurdu.

örnek 2:

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

çalışıyor. Yani bir anlamda argümanı göz ardı ediyor ve sadece dat adında bir veri çerçevesi arıyor. Buna ne dersem de aynısını yapar.

cevap

8

Ben It can

(... Ben S4 büyük bir hayranıyım değilim neden resons biri) bu -yet olduğu another- sorun nedeniyle S4 yöntemlerin ayrıştırma ağacında ortamların tanımına tahmin onlar içten ortamlarda nasıl baş bildikleri

> 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 

ilk etapta, paketin maintainers'ı bu bilgileri göndermek olmalıdır: dat sonuna tırnak işareti ekleyerek gösterilebilir. Fonksiyonları uyarlamaları gerekecek.

Kendiniz için bir -çok kirli çözüm, "dat" ı global ortama koymak ve daha sonra silmek.

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

DÜZENLEME: Sadece netlik için, bu mümkün en kötü çözümü konusunda gerçekten, ama daha iyi bir şey bulmak için başaramadılar. Eğer başka biri size küresel ortamınıza dokunmak zorunda kalmayacağınız bir çözüm sunsa, her zaman bunu kullanın.

+0

Bir ton Joris teşekkürler. S4 yöntemlerine oturmam ve kemirmem gerekiyor. En azından şimdilik bu çözümün nasıl davrandığını görebiliyorum. şerefe. – Maiasaura

+0

Çalışma alanınızda "dat" adı verilen bir nesne olmadığı sürece iyi davranır. Eğer öyleyse, o atama() fonksiyonu tarafından üzerine yazılacaktır. Bu kesinlikle önlemek istediğiniz bir şey ... –

+1

S4 ve .GlobalEnv tekrar değil: alnına tokat :. –

İlgili konular