Как размаскировать функцию в R из-за конфликтов имен в пути поиска

Когда я загрузил пакет debug для отладки скрипта с zoo объектами, у меня возникла проблема: функция index из zoo была замаскирована пакетом debug. Как я могу разоблачить index? В общем, как решить эти проблемы с конфликтами имен? Мы просто не используем пакет debug с `zoo'?


person ahala    schedule 13.07.2010    source источник


Ответы (3)


Экспортированные символы всегда можно идентифицировать с помощью оператора :::

zoo::index

Доступ к скрытым функциям, не объявленным в пространстве имен, по-прежнему можно получить с помощью ::: (тройное двоеточие), и пример будет таким:

zoo:::.onLoad

который вы можете видеть, даже если он не экспортируется.

person Dirk Eddelbuettel    schedule 13.07.2010
comment
С другой стороны, это причина, по которой установка system‹-function(){} волшебным образом не делает R безопасным. - person mbq; 14.07.2010
comment
Спасибо. Я могу временно установить index‹-zoo::index, чтобы обойти эту проблему, не меняя исходный сценарий. Кажется, что некоторые пакеты просто не работают вместе. - person ahala; 14.07.2010

Вы можете выгрузить пакет с замаскированными функциями, а затем перезагрузить его. Он восстановит приоритет в пути поиска:

unloadNamespace("zoo")
library("zoo")

В будущем, если вы хотите загрузить пакет, не давая ему маскировать другие функции, вы можете указать его позицию в пути поиска сколь угодно большим числом:

library("debug", pos = .Machine$integer.max)
person Lionel Henry    schedule 08.05.2013

Он замаскирован только для вас, но не замаскирован для зоопарка, поэтому, когда функция зоопарка пытается использовать индекс, она все равно сначала найдет свой собственный индекс.

В зоопарке также есть метод time.zoo, поэтому, если z является объектом зоопарка, вы можете использовать time(z) вместо index(z).

Наконец, вы всегда можете обратиться к zoo::index, чтобы убедиться, что вы получили тот, что находится в зоопарке.

person G. Grothendieck    schedule 14.07.2010
comment
Спасибо. time.zoo будет работать, но я не хочу менять исходный сценарий. И индекс (зоообъект) сообщает об ошибке в моем случае. По-видимому, R не знает, что index.zoo следует вызывать для зоопарка. - person ahala; 14.07.2010
comment
Если вы загружаете зоопарк после загрузки debug/mvbutils, а не наоборот, то индекс в зоопарке будет тем, который вы получаете по умолчанию, а не индексом в debug/mvbutils. - person G. Grothendieck; 14.07.2010