为什么as.formula只有内部流明()内一起工作()?(Why does as.formula

2019-10-20 20:48发布

与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)

但我有真正的麻烦缠绕我的头周围为什么一个工作,另一个没有。

Answer 1:

因为您要建立与全球环境的公式发生故障的例子将失败:

> 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"     


文章来源: Why does as.formula only work inside lm() inside with()?