2013-04-08 6 views
5

अद्यतन: पिछला शीर्षक Is there any specific way to pass data frame as an argument to a function? था लेकिन यहां शानदार लोगों के अनुसार यह सही सवाल नहीं था। मूल पोस्ट नीचे है।आर फ़ंक्शन के अंदर प्रभाव प्लॉट कैसे चलाएं

जब मैं somefunc(sleepstudy) साथ समारोह निम्नलिखित भाग गया,

somefunc<-function (dataLme) 
{ 
library(effects) 
library(lme4) 

fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), dataLme, 
     REML = 0, verbose = TRUE) 

plot(effect("Days",fm8)) 
} 

मैं एक त्रुटि मिल गया।

Error in plot(effect("Days", fm8)) : 
    error in evaluating the argument 'x' in selecting a method for function 'plot': Error in is.data.frame(data) : object 'dataLme' not found 

लेकिन अगर मैं मैन्युअल रूप से निष्पादित

library(effects) 
library(lme4) 
fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), sleepstudy, 
    REML = 0, verbose = TRUE) 
plot(effect("Days",fm8)) 

मैं किसी भी त्रुटि नहीं मिला।

मैंने सोचा कि आर मूल्य के आधार पर गुजरता है जो पूरे ऑब्जेक्ट सामग्री को फ़ंक्शन तर्क में कॉपी करता है। लेकिन ऐसा लगता है कि मैं पूरी तरह से सही नहीं था। क्या कोई बता सकता है कि क्या हो रहा है?

+3

मुझे नहीं लगता कि इस मुद्दे को अर्थ विज्ञान गुजर आर के तर्क है, मुझे लगता है कि मुद्दा यह है कि 'effect' है गलत जगह पर मॉडल फिटिंग कॉल को 'eval' करने की कोशिश कर रहा है। या कम से कम, एक ऐसी जगह जो किसी फ़ंक्शन के अंदर चलने पर काम नहीं करती है। – joran

+0

@ रिकार्डोस्पोर्टा दिन। टाइपो के लिए खेद है। मैंने इसे अपने प्रश्न में तय किया। धन्यवाद! –

+0

@ जोरान मैं देखता हूं। आपने इसे तेजी से कैसे समझ लिया? :-) ओह अच्छा। मुझे लगता है कि लेखक से संपर्क करने का समय है। आपकी सहायताके लिए धन्यवाद! –

उत्तर

5

ए (hacky) वैकल्पिक हल वैश्विक वातावरण, जहां effect() इसे खोजने के लिए सक्षम हो जाएगा में dataLme आवंटित करने के लिए है:

library(effects) 
library(lme4) 

somefunc <- function (dataLme) { 
    ## Assign to a symbol that's unlikely to be in use in .GlobalEnv 
    ## (and make sure this function cleans up after itself!) 
    assign(".TeMpVaR", dataLme, envir=globalenv()) 
    on.exit(rm(.TeMpVaR, envir=globalenv())) 

    fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), .TeMpVaR, 
     REML = 0, verbose = TRUE)  
    plot(effect("Days",fm8)) 
} 

somefunc(sleepstudy) 
+0

बढ़िया! बहुत बहुत धन्यवाद। –

+0

@ थॉमस - मैंने अभी एक बेहतर समाधान के साथ संपादित किया है। –

+0

किसी कारण से, मुझे नए अपडेट के साथ एक ही त्रुटि मिलती है। –

2

यह केवल एक आंशिक जवाब है, लेकिन मैं अपने परीक्षण प्रक्रिया दस्तावेज़ के लिए करना चाहता था । मैं मुख्य रूप से यह दिखाना चाहता था कि यह मुद्दा विशेष रूप से effects पैकेज के साथ lme4 पैकेज (जो मैं बनाए रखता हूं, और जिस तरह से इस तरह की समस्याओं का सामना करना पड़ा है) के साथ समस्या है: ऐसी समस्याएं lme4 के विकास संस्करण में तय की गई हैं, लेकिन कुछ स्थिर संस्करण, lme4.0 अपने सिस्टम पर के रूप में स्थापित करने में जारी रहती है ...)

library("effects") 

showpkgs <- function() names(sessionInfo()$otherPkgs) 
somefunc<-function (dataLme, pkg="nlme") { 
    require(pkg,character.only=TRUE) 
    on.exit(detach(paste("package",pkg,sep=":"),unload=TRUE,character.only=TRUE)) 
    if (pkg=="nlme") { 
     fm8 <- lme(Reaction ~ 1 + Days,random=~Days|Subject, dataLme) 
    } else { 
     fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), dataLme, REML = 0) 
    } 
    plot(effect("Days",fm8)) 
} 

त्रुटि तब होती है कि क्या हम स्थिर lme4 का उपयोग, विकास lme4, या पुराने nlme पैकेज

data("sleepstudy",package="lme4") 
showpkgs() 
somefunc(sleepstudy) ## nlme 
showpkgs() ## warning about unloading nlme namespace due to glmmADMB dep. (??) 
somefunc(sleepstudy,pkg="lme4.0") ## lme4-stable 
showpkgs() ## failure to remove Matrix/warning message 
somefunc(sleepstudy,pkg="lme4") ## lme4-devel 
showpkgs() ## leaves RcppEigen, Rcpp loaded as well 

मैंने effects पैकेज पर एक नज़र डाली, और एक साधारण सार्वभौमिक फिक्स तुरंत स्पष्ट नहीं है। विकासlme4 के लिए eval(cl,envir=environment(formula(mod))) काम करता है के लिए प्रासंगिक eval(cl) लाइनों को बदलने, लेकिन स्थिर lme4 या nlme के लिए नहीं ...

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