在RI中,通常需要循环浏览lm
类型对象列表(例如glm
,lme
,clm
)并使用新公式或其他参数更新它们。我使用lapply()
执行此操作,因为它以相同的列表格式返回它们,名称保持不变,因此我可以继续此过程。
有时我传递的参数是动态的,并且每个模型都有所不同。例如,
lapply(names(mylist) function(ii) {
jj<-myotherlist[[ii]];
update(mylist[[ii]],.~.+jj)
})
其中jj
是一个术语,它被添加到列表中的每个模型中,并在每个模型的基础上在其他列表中定义。
假设特定模型的预期结果公式应该是y~a+b+c
。取而代之的是,生成的lm
对象中的调用对象包含y~a+b+jj
。因此,在某些情况下,生成的lm
对象行为正常,但每当需要计算公式时,它都会出错,因为jj
早已消失。是否有一种推荐的方法可以强制update()
在其call
对象的输出中写入call
对象时强制扩展其参数中的所有变量,或强制使用lm
对象的函数来评估调用model
对象的内部上下文而不是全局上下文,这样至少我可以将新变量填充到data
或lm
对象中data=cbind(sharedByAllModels,y=kk)
样式对象通常包含?
AND,如果使用动态变量更新的部分是数据参数怎么办? E.g:
kk
...其中{{1}}对于当前模型是唯一的(可能是sharedByAllModels数据帧中某些列的某种聚合)。
答案 0 :(得分:2)
回答您的主要问题,您可以使用bquote()
来控制更新公式对象的哪些部分(即.()
内的部分)得到评估。
mylist <- list(y ~ a + b, y ~ A + B)
myotherlist <- list("c", "C")
lapply(1:2, function(ii) {
jj <- as.name(myotherlist[[ii]])
update(mylist[[ii]], bquote(. ~ . + .(jj)))})
# [[1]]
# y ~ a + b + c
#
# [[2]]
# y ~ A + B + C
或者,以类似的方式使用substitute()
:
lapply(1:2, function(ii) {
jj <- as.name(myotherlist[[ii]])
update(mylist[[ii]], substitute(. ~ . + jj))
})
# [[1]]
# y ~ a + b + c
#
# [[2]]
# y ~ A + B + C
答案 1 :(得分:1)
使用do.call
,它在执行前评估其参数。请参阅anova test fails on lme fits created with pasted formula。