与R工作组,这是一个真正的跆拳道:为什么as.formula只能在()内部的lm()内工作?
R> f_string <- 'Sepal.Length ~ Sepal.Width'
R> l <- with(iris, lm(as.formula(f_string))) # works fine
R> f_formula <- as.formula(f_string)
R> l <- with(iris, lm(f_formula))
Error in eval(expr, envir, enclos) : object 'Sepal.Length' not found
为什么as.formula必须是lm()
调用之内?我明白了,这是关于哪些事情环境评估中的一个问题,因为这个工程:
R> f_formula <- with(iris, as.formula(f_string))
R> lm(f_formula)
,但我有真正的麻烦缠绕我的头周围为什么一个作品,另一个没有。
> f_formula <- as.formula(f_string)
> l <- with(iris, lm(f_formula))
Error in eval(expr, envir, enclos) : object 'Sepal.Length' not found
> str(f_formula)
Class 'formula' length 3 Sepal.Length ~ Sepal.Width
..- attr(*, ".Environment")=<environment: R_GlobalEnv>
而且也没有Sepal.Length
有:因为您要建立与全球环境的公式
您可能希望清理代码并使其完全可重现。然而,看着'as.formula'的代码我也不明白。我认为'as.formula(f_string,env = basenev())'或'as.formula(f_string,env = parent.frame())'应该可以工作(我期望前者),但只有当'env'是'missing'它的工作原理。 (我希望你知道你不应该在这里使用''''lm'和朋友有一个'data'参数是有原因的) – Roland 2014-09-04 07:52:19
@Roland哎呀,不小心在那里留下了一些东西...... – naught101 2014-09-04 08:03:21
@Roland :关于'data ='的争论也是完全正确的。它让'lm()'把字符串变好,所以我可以避免整个问题。尽管如此,它很有趣,作为一个compsci初学者:) – naught101 2014-09-04 08:12:01