字符串公式未在全球环境中评估?

时间:2017-07-26 13:50:03

标签: r

循环中的字符串公式会引发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)

2 个答案:

答案 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的反模式。