Проблема в том, что вы назначаете новую версию layout
для графики пространство имен , то есть то, что возвращает environment(graphics:::layout)
.Вы вместо хотите выполнить назначение в прикрепленную графику пакет (т. Е. Среду, отображаемую как "package:graphics"
в вашем пути поиска).
В вашем примере, когдаища layout
, R просматривает список вложенных пакетов, возвращаемых search()
, и находит оригинал layout
в package: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(){}
Немного более детальной разработки, которая может быть полезна для некоторых:
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")