循环中的字符串公式会引发standardize()
错误,而非循环版本不会引发错误。环境问题?
library(arm)
set.seed(1)
df <- data.frame(y=runif(50),
x1=runif(50),
x2=runif(50))
# does not work
for (i in c("x1", "x2")) {
f <- paste("y", i, sep="~")
m0 <- lm(f, data=df)
m0z <- arm::standardize(m0)
}
formula(m0)
#y ~ x1
#<environment: 0x140745e40>
# works
m1 <- lm(y ~ x1, data=df)
m1z <- arm::standardize(m1)
m2 <- lm(y ~ x2, data=df)
m2z <- arm::standardize(m2)
答案 0 :(得分:2)
在lm
对象中实际替换公式非常重要:
for (i in list(quote(x1), quote(x2))) {
f <- bquote(y ~ .(i))
m0 <- eval(bquote(lm(.(f), data=df)))
m0z <- arm::standardize(m0)
}
答案 1 :(得分:0)
解决方案是不使用字符串公式,而是从表达式构造公式,并评估:
f = eval(bquote(y ~ .(as.name(i))))
这是有效的,因为f
将在当前环境中构建。
或者,只需手动拨打as.formula(f)
,而不是将裸f
传递给lm
;但是,我总是不喜欢通过琴弦绕道而行。这是一种称为stringly typing的反模式。