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

我没有收到任何错误。

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

4

2 回答 2

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)
于 2013-04-08T18:00:33.707 回答
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))
}

无论我们使用 stable lme4、 developmentlme4还是较旧的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...

于 2013-04-08T18:26:40.647 回答