2013-04-08 25 views
5

更新:以前的標題是Is there any specific way to pass data frame as an argument to a function?,但根據這裏的傑出人物,這是不正確的問題。原文是在下面。如何在R功能中運行效果圖

當我跑在與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)) 

我沒有得到任何錯誤。

我以爲R通過值意味着將整個對象內容複製到函數參數。但看起來我並不完全正確。任何人都可以解釋發生了什麼?

+3

我不認爲這個問題爲R的參數傳遞語義,我認爲這個問題是'effect'是試圖在錯誤的地方「評估」模型擬合調用。或者至少,在函數內部運行時導致它無法工作的地方。 – joran 2013-04-08 17:42:27

+0

@RicardoSaporta天。對不起,錯別字。我在我的問題中解決了它。謝謝! – 2013-04-08 17:43:38

+0

@joran我明白了。你是怎麼解決這個問題的? :-) 好吧。我想現在是時候聯繫作者了。謝謝你的幫助! – 2013-04-08 17:48:55

回答

5

A(哈克)解決方法是分配dataLme到全球環境中,effect()將能夠找到它:

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

非常好!非常感謝。 – 2013-04-08 18:11:45

+0

@Thomas - 我剛剛編輯了一個改進的解決方案。 – 2013-04-08 18:12:28

+0

出於某種原因,我收到與更新相同的錯誤。 – 2013-04-08 18:27:27

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包,並且一個簡單的通用修復並不是很明顯。更改相關eval(cl)eval(cl,envir=environment(formula(mod)))作品發展lme4,但並不穩定lme4nlme ...