为什么替换公式适用于lm和oneway.test,但不适用于aov?

时间:2015-07-15 14:27:09

标签: r formula substitution

 example <- data.frame(
   var1 = c(1, 2, 3, 4, 5, 6, 7, 8),
   class = c(rep(1, 4), rep(2, 4))
 )
 example$class <- as.factor(example$class)

This question提供了使用substitute和as.name为aov创建公式的修复方法,但我不明白为什么公式适用于oneway.test和{{1} }。有人可以解释一下吗?

lm

2 个答案:

答案 0 :(得分:3)

问题是substitute正在返回未评估的呼叫,而不是公式。比较

class(substitute(a~b))
# [1] "call"
class(a~b)
# [1] "formula"

如果你评估它(就像在另一个答案中所做的那样),两者都可以正常工作

fm <- eval(substitute(i ~ class, list(i = as.name('var1'))))
oneway.test(fm, example)
aov(fm, example)

您收到的错误消息来自terms调用的aov()函数。此功能需要对公式进行操作,而不是调用。这基本上就是发生了什么

# ok
terms(a~b)

# doesn't work
unf <- quote(a~b)  #same as substitute(a~b)
terms(unf)
# Error in terms.default(unf) : no terms component nor attribute

# ok
terms(eval(unf))

答案 1 :(得分:0)

差异的一个可能来源是fm实际上是call而不是formula,显然某些功能会进行转换,而其他功能则没有。{/ p>

如果你这样做:

fm <- as.formula(fm)

然后调用aov即可。