2011-12-28 90 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