2010-08-10 44 views
7

R中是否有可能保護函數名稱(或通常的變量),以便它們不能被屏蔽。R中的保護函數名稱

我最近發現,當創建一個名爲「new」的數據框時,這可能是一個問題,該數據框掩蓋了lmer使用的函數,從而使其停止工作。 (一旦知道問題出在哪裏,恢復很容易,這裏「rm(新)」就是這樣做的。)

+0

數據幀不能覆蓋的功能。您可以同時使用兩者。 – James 2010-08-11 08:43:07

+0

「覆蓋」是錯誤的詞。面具? – AndyF 2010-08-11 14:55:19

+1

重複的http://stackoverflow.com/questions/936748/declaring-a-const-variable-in-r – hadley 2010-08-13 02:00:38

回答

4

也許使用環境!這是區分名稱空間的好方法。例如:

> a <- new.env() 
> assign('printer', function(x) print(x), envir=a) 
> get('printer', envir=a)('test!') 
[1] "test!" 
+2

當然,有人可能會覆蓋'a':) – geoffjentry 2010-08-11 04:31:05

2

@hdallazuanna建議(via Twitter)

new <- 1 
lockBinding('new', globalenv()) 

這是有意義的,當變量是用戶創建的,但不當然,防止從封裝覆蓋的功能。

6

對於您的問題有一個簡單的解決方法,無需擔心保護變量名稱(儘管使用lockBinding看起來確實很有趣)。如果某個功能被屏蔽,如在您的示例中,在::運營商的幫助下,仍然可以調用屏蔽版本。

通常,語法是packagename::variablename

(如果你想要的功能還沒有被從包中導出,那麼你就需要三個冒號代替,:::。這不應該在這種情況下,然而適用。)

+0

如果我打電話功能不起作用,在一個依賴其他功能的套件中,無意中被掩蓋了。 – AndyF 2010-08-11 14:56:19

+0

@AndyF是的,這是一個很好的觀點。我在答案中看到了一個主題:R不保護用戶不受他們自己的影響。這非常類似於Linux。 ;) – 2010-08-12 14:29:17