2017-05-02 103 views
0

R允許函數和變量具有相同的名稱。我用lm函數測試它,但是當我創建了我自己的函數時,我得到一個錯誤。有人能告訴什麼是我的錯誤R:同名變量和函數

> k<-function(d){2*d} 
> k(5) 
[1] 10 
> k 
function(d){2*d} 
> k<-c(1,2) 
> k 
[1] 1 2 
> k(2) 
Error: could not find function "k" 

流明功能

> lm<-2 
> lm 
[1] 2 
> lm(airquality$Ozone~., data=airquality) 

Call: 
lm(formula = airquality$Ozone ~ ., data = airquality) 

Coefficients: 
(Intercept)  Solar.R   Wind   Temp  Month   Day 
    -64.11632  0.05027  -3.31844  1.89579  -3.03996  0.27388 

> lm 
[1] 2 
+0

您已經在第一個實例的用戶環境中定義並覆蓋了k。在第二個例子中,定義的'lm'不會覆蓋'stats :: lm'函數。 –

+0

另外,雖然這很有趣,但有人需要說_不要這樣做。 – alistaire

+0

@AdamQuek明白了。這是否意味着如果一個函數在用戶環境中定義,那麼我不能有一個同名的變量? – learnlifelong

回答

1

由於@AdamQuek評論,我認爲,之所以lm <- 2不會覆蓋lm()功能在stats包工作正常是因爲該函數存在於不同的名稱空間中。當你定義你的函數k()時,你在本地命名空間中定義了它,然後在本地命名空間中覆蓋它。

R有一組規則用於確定在評估變量/函數時使用哪個命名空間的順序。如果你在本地定義lm()爲:

lm <- function(x) { print(x) } 

然後調用lm("Hello World")的確會打印的 「Hello World」。如果你仍然想使用的lm()版本從stats包,您可以使用該功能的全名:

stats::lm(...) 

換句話說,如果你不符合條件的功能,R將首先搜索本地名稱空間,然後它將在您已加載的庫中進行搜索。

而作爲Alistaire評論,請不要這樣做。在任何編程語言中,都應避免在常用包/庫中的函數之後命名用戶定義的函數。

+0

謝謝,這是否意味着在一個特定的命名空間,一個函數和一個變量不能有相同的名稱 – learnlifelong

+0

@learnlifelong是的,這是我的理解。你自己看到了;變量'k'只能是本地的一個東西,不管是函數還是後面的變量,就像您分配/定義變量一樣。 –