我在自己的功能中使用glmulti包时遇到了麻烦。
以下代码是重现错误的简化示例: 错误:对象' poplrun'找不到
这是在函数中创建的data.frame
。
在第二个例子中,它没有找到参数l。
我认为问题与调用glmulti的环境有关。我找到了这篇文章
Trouble passing on an argument to function within own function
并尝试将do.call
与substitute(poplrun)
或as.name("poplrun")
一起使用,但显然我错过了一些东西,因为它没有用。我也找到了这篇文章
Object not found error when passing model formula to another function
并尝试识别公式中的环境(正如您在第一个示例中看到的那样),但这个环境也不起作用。 我真的很感激任何帮助,因为我现在已经两天试图解决这个难题......
谢谢堆!
set.seed(5)
df1<-data.frame(Scenario=rep(LETTERS[1:2], each=10),
Iteration=rep(1:10, 2), V1=rnorm(n=20, mean=0.5, sd=0.1))
LookUpT<-data.frame(Scenario=rep(LETTERS[1:5]), SV1=1:5, SV2=6:10 )
InteractRun<- function (
param="V1" ,
SVs=c("SV1", "SV2"),
ic="aic",
l=1
) {
poplrun<-df1
require(plyr)
poplrun<- join(poplrun, LookUpT, by = 'Scenario', type="left")
xs<-paste(SVs, collapse="*")
.env<-environment()
formula<-as.formula(paste0(param, "~", xs), env=.env)
require(betareg)
require(glmulti)
cand<-glmulti(formula, data=poplrun, method="d", level=l,
fitfunc=betareg, na.action=na.omit)
print(cand)
}
InteractRun()
set.seed(5)
df1<-data.frame(Scenario=rep(LETTERS[1:2], each=10), Iteration=rep(1:10, 2),
V1=round(rnorm(n=20, mean=20, sd=2)))
LookUpT<-data.frame(Scenario=rep(LETTERS[1:5]), SV1=1:5, SV2=6:10 )
InteractRun<- function (
param="V1" ,
SVs=c("SV1", "SV2"),
fam="poisson",
ic="aic",
l=1
) {
poplrun<-df1
require(plyr)
poplrun<- join(poplrun, LookUpT, by = 'Scenario', type="left")
xs<-paste(SVs, collapse="*")
formula<-as.formula(paste0(param, "~", xs)) # set up formula to be used
glm1<-glm(data=poplrun, formula, family=fam, na.action=na.omit)
require(glmulti)
cand<-glmulti(glm1, method="d", level=l, na.action=na.omit)
print(cand)
}
InteractRun()
答案 0 :(得分:4)
我要回答我自己的问题......过了一会儿,我想出了如何解决这个问题。
对glmulti的正确调用是使用do.call
,但不需要substitute()
或as.name()
。在示例1中,调用应该是:
cand <- do.call("glmulti", list(formula, data=poplrun, method="d", level=l, fitfunc=betareg, na.action=na.omit))
在例2中:
cand <- do.call("glmulti", list(glm1, method="d", level=l, na.action=na.omit))