2011-12-28 92 views
5

有人可以解釋下面的代碼嗎?我更換了佈局功能的圖形包用我自己的版本,但它似乎重新出現神奇永久替換功能

env = environment(graphics:::layout) 
unlockBinding("layout" , env = env) 
assign("layout" , function(){} , envir = env) 
lockBinding("layout" , env = env) 

# this still shows the original layout function! how is that possible? 
layout 

# this shows function(){} as expected 
graphics:::layout 
+0

所有 - 我最近對與環境有關的所有問題表示歉意。這被證明是一個複雜而令人困惑的話題。如果有任何推薦的閱讀材料(標準R PDF除外,它不是非常有用),請告訴我! – SFun28 2011-12-28 21:29:13

+1

不要道歉;我從他們身上學到了很多東西。我自己沒有,但我聽說[Chambers](http://www.amazon.com/Software-Data-Analysis-Programming-Statistics/dp/1441926127/ref=sr_1_9?s=books&ie = UTF8&qid = 1325110851&sr = 1-9)書是一種R編程(而不是統計計算)聖經。 – joran 2011-12-28 22:23:02

+0

我其實剛剛訂購了一小時前的那本書。 =)等不及了。謝謝你的鼓勵,古蘭經! – SFun28 2011-12-28 22:25:43

回答

6

的問題是,你的顯卡命名空間分配你的layout新版本,這是environment(graphics:::layout)返回的內容。您需要而不是想將作業分配到附加圖形(即在搜索路徑中顯示爲"package:graphics"的環境)。

在你的榜樣,尋找layout時,R向下搜索通過search()返回連接包的列表,並且發現在package:graphicslayout,之前曾獲得功能,您已經分爲namespace:graphics

的解決方案是簡單的,只需要在第一行分配給env一個環境的變化:更

# Assign into <environment: package:graphics> 
# rather than <environment: namespace:graphics> 
env <- as.environment("package:graphics") 

unlockBinding("layout" , env = env) 
assign("layout" , function(){} , envir = env) 
lockBinding("layout" , env = env) 

# Now it works as expected 
layout 
# function(){} 

的位的闡述,這可能是有用的一些:

search() # Shows the path along which symbols typed at the command 
      # will be searched for. The one named "package:graphics" 
      # is where 'layout' will be found. 

# None of these return the environment corresponding to "package graphics" 
environment(layout) 
environment(graphics::layout) 
environment(graphics:::layout) 

# This does 
as.environment("package:graphics") 
+0

謝謝,喬希!那麼爲什麼'env = environment(graphics ::: layout)'不能工作,而是'env < - as.environment(「package:graphics」)'呢? – SFun28 2011-12-28 22:27:07

+1

另請參閱'assignInNamespace' - 如果您想更改S3方法,事情會變得更加複雜。 – hadley 2011-12-28 22:50:55

+0

@ SFun28:第一個可以獲得只有圖形使用的名稱空間環境,第二個可以獲得其他所有使用的圖形包環境。 (我不確定這將如何影響其他附加的包導入圖形) – hadley 2011-12-28 22:52:38