如何在R函数内运行效果图

时间:2013-04-08 17:28:27

标签: r

更新:以前的标题是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))

我没有收到任何错误。

我认为R通过值传递意味着将整个对象内容复制到函数参数。但看起来我并不完全正确。谁能解释一下发生了什么?

2 个答案:

答案 0 :(得分:5)

(hacky)解决方法是将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)

答案 1 :(得分: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 ... < / p>