2014-09-04 80 views
1

與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有:因爲您要建立與全球環境的公式

+1

您可能希望清理代碼並使其完全可重現。然而,看着'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

+0

@Roland哎呀,不小心在那裏留下了一些東西...... – naught101 2014-09-04 08:03:21

+0

@Roland :關於'data ='的爭論也是完全正確的。它讓'lm()'把字符串變好,所以我可以避免整個問題。儘管如此,它很有趣,作爲一個compsci初學者:) – naught101 2014-09-04 08:12:01

回答

2

你失敗的例子失敗。如果在全球環境中創建合適的對象,你可以讓它工作:

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

使用'environment()'是一個稍微漂亮的(在我看來)的方式來得到一個對象被分配的環境相比'attr(x,「。Environment」 )'。所以你可以像'ls(envir = environment(f_formula))'那樣做。我很難將這種行爲稱爲「煩人」,因爲這意味着可以通過'lm()'的'data ='參數輕鬆處理。不正確地使用它們時不要生氣。正如@Roland首先所說的,使用'lm(f_formula,iris)'而不是'with(iris,lm(f_formula))'。 – MrFlick 2014-09-04 14:03:50

+1

我使用了這種符號,因爲這是'str(f)'顯示它的方式。大多數R對象(函數,數據框)不會將其環境存儲在屬性中。我不知道爲什麼公式。 'print.formula'很有趣。令人煩惱的是,對於一種功能性語言來說,純粹的功能主義者會忽略的一些評估事項正在發生。 – Spacedman 2014-09-04 15:05:47

相關問題