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