繁体   English   中英

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

[英]How to run effect plot inside of a R function

更新:以前的标题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通过值传递意味着将整个对象内容复制到函数参数。 但看起来我并不完全正确。 谁能解释一下发生了什么?

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

这只是部分答案,但我确实想记录我的测试程序。 我主要想表明问题特别是effects包而不是lme4包(我维护它,并且遇到了这些问题:大多数这样的问题在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软件包, lme4出现错误

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM