如何在 r 中的公式中求值

How to evaluate in a formula in r

假设有一个公式:

f1 = as.formula(y~ var1 + var2 + var3)
f1
## y ~ var1 + var2 + var3

然后我想通过添加命名向量来更新公式 a

a = 'aaabbbccc'
f2 = update(f1, ~ . + a)
f2
## y ~ var1 + var2 + var3 + a

这不是我所期望的。我希望 a 在公式中进行评估。然后我试了这个:

f3 = update(f1, ~ . + get(a))
f3
## y ~ var1 + var2 + var3 + get(a)

同样失败。我期望的是:

y ~ var1 + var2 + var3 + aaabbbccc

任何帮助将不胜感激!

如果您在全球环境中评估这些陈述,那么您可以:

f <- y ~ var1 + var2 + var3
a <- as.name("aaabbbccc")
update(f, substitute(~ . + a, env = list(a = a)))
## y ~ var1 + var2 + var3 + aaabbbccc

否则,你可以这样做:

update(f, substitute(~ . + a, env = environment()))
## y ~ var1 + var2 + var3 + aaabbbccc

重要的是enva的值是一个符号,不是字符串:as.name("aaabbbccc")quote(aaabbbccc),但不是 "aaabbbccc"

有点不直观,substitute(expr, env = .GlobalEnv) 等同于 substitute(expr, env = NULL)。这是第一种情况下必须通过 list(a = a)(或类似)的唯一原因。

我应该指出,在这种情况下,“从头开始”自己创建 substitute 结果并不太难:

update(f, call("~", call("+", quote(.), a)))
## y ~ var1 + var2 + var3 + aaabbbccc

这种方法的优点是与环境无关,因此,我可能会使用这种方法。