Постоянно заменяющая функция - PullRequest
5 голосов
/ 29 декабря 2011

Может ли кто-нибудь объяснить следующий код? Я заменяю функцию макета в графическом пакете своей собственной версией, но, похоже, она снова появляется волшебным образом

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

1 Ответ

6 голосов
/ 29 декабря 2011

Проблема в том, что вы назначаете новую версию 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...