永久更换功能

SFu*_*n28 5 r

有人可以解释下面的代码吗?我正在用我自己的版本替换图形包中的布局功能,但它似乎神奇地重新出现

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
Run Code Online (Sandbox Code Playgroud)

Jos*_*ien 6

问题是您要将新版本分配给layout图形命名空间,这是返回的内容environment(graphics:::layout).您反而希望将分配到附加的图形包中(即出现"package:graphics"在搜索路径上的环境).

在你的榜样,寻找时layout,R向下搜索通过返回附加包的列表search(),发现原来layoutpackage:graphics,之前它曾经获得的功能你分成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(){}
Run Code Online (Sandbox Code Playgroud)

更详细一点,可能对某些人有用:

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")
Run Code Online (Sandbox Code Playgroud)