2010-09-07 12 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' 

जब तक डेटा नामक डेटा फ्रेम नहीं है, तो यह काम नहीं करता है। अगर मैं results=lapply(list_of_datasets, analyze) का उपयोग करता हूं, तो यह काम नहीं करता है। तो क्या देता है? मेरे कहा रैपर के बिना, मैं इस समारोह के माध्यम से डेटासेट की एक सूची नहीं कर सकता। अगर किसी के पास विचार या विचार हैं कि यह क्यों हो रहा है या मैं इसके आसपास कैसे हो सकता हूं, तो यह बहुत अच्छा होगा।

उदाहरण 2:

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

ठीक काम करता है। तो एक अर्थ में यह तर्क को अनदेखा कर रहा है और सिर्फ शाब्दिक रूप से डेटा नामक डेटा फ्रेम की तलाश में है। इससे कोई फर्क नहीं पड़ता कि मैं इसे क्या कहता हूं।

उत्तर

8

मुझे लगता है कि यह एस 4 तरीकों में से पार्स पेड़ में वातावरण की परिभाषा की वजह से -yet है another- समस्या (resons कारण है कि मैं एस 4 के एक बड़े प्रशंसक नहीं हूँ में से एक ...)

यह कर सकते हैं

> 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 के आसपास उद्धरण जोड़कर दिखाया जाएगा। उन्हें कार्यों को अनुकूलित करना होगा।

आपके लिए हर गंदे कामकाज, वैश्विक पर्यावरण में "डेटा" डालना और बाद में इसे हटाना है।

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

धन्यवाद एक टन जोरीस। मुझे वास्तव में बैठना होगा और एस 4 विधियों पर हड्डी लगाना चाहिए। कम से कम अब मैं देख सकता हूं कि यह कामकाज कैसे व्यवहार करता है। खुश होती है। – Maiasaura

+0

यह तब तक अच्छा व्यवहार करता है जब तक आपके पास अपने कार्यक्षेत्र में "डेटा" नामक ऑब्जेक्ट नहीं है। यदि ऐसा है, तो वह असाइन() फ़ंक्शन द्वारा ओवरराइट किया जाएगा। यह कुछ है जो आप निश्चित रूप से टालना चाहते हैं ... –

+1

एस 4 और WebobalEnv फिर से नहीं: माथे पर थप्पड़ मारो:। –

संबंधित मुद्दे