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
答案 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
即可。