与R工作,这是一个真正的跆拳道:
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
那里。 如果您在创建全球环境合适的对象,你可以让它工作:
> Sepal.Length=1:10
> Sepal.Width=runif(10)
> l <- with(iris, lm(f_formula)) # "works" (ie doesn't error)
但是,这是完全无视 iris
数据。 欢迎来到烦人[R行为的世界。
在其它实例中都计算内式对象iris
数据帧作为环境。 如果调试lm
,并看看什么formula
是在你的工作情况之一:
Browse[2]> str(formula)
Class 'formula' length 3 Sepal.Length ~ Sepal.Width
..- attr(*, ".Environment")=<environment: 0x9d590b4>
你会看到环境不再是全球性的。 如果你想看看有什么在那样的环境,从公式的属性和列表得到它:
Browse[2]> e = attr(formula,".Environment")
Browse[2]> with(e,ls())
[1] "Petal.Length" "Petal.Width" "Sepal.Length" "Sepal.Width" "Species"