2012-06-18 22 views

回答

8

這裏的諷刺是你沒有不要覆蓋它。您創建了一個名爲「print」的數據對象,當您在控制檯鍵入print時,eval-print循環接管並返回它。如果您通過輸入print("something")print(42)來正確測試打印的行爲,您會發現解釋器仍然能夠在基本NAMESPACE中找到print.default函數。定義與現有函數名稱相同的數據對象是不好的做法,不是因爲它們在R解釋器中被覆蓋,而是因爲它們覆蓋了用戶的頭腦。解釋者通過查看是否存在表示函數調用的開放括號來確定您的意圖(好吧,它決定了它會做什麼)。如果字母打印後面跟着「(」,那麼解釋器會查看參數的類併發送相應的打印方法。

3

把它送回從命名空間

print = base::print 
+3

這會在全局環境中產生不必要的'base :: print'副本。刪除你創建的'print'對象(如@gsk在他的回答中建議的那樣) –

+1

它從來不在基礎:NAMESPACE中,它比編程暴力更耗費基礎功能。 –

10

rm不會刪除的基本對象,所以你可以運行:

rm(print) 

有趣的是,你可以打印件事情:

> print <- FALSE 
> print 
[1] FALSE 
> print("hi") 
[1] "hi" 
> rm(print) 
> print("hi") 
[1] "hi" 
> print 
function (x, ...) 
UseMethod("print") 
<bytecode: 0x2a3a148> 
<environment: namespace:base> 
相關問題