Пространства имен и универсальные функции в R - PullRequest
6 голосов
/ 27 марта 2019

этот вопрос является чем-то вроде продолжения этого вопроса . Рассмотрим следующий пример

set.seed(1)
x <- cumsum(rnorm(10))
y <- stats::arima(x, order = c(1, 0, 0))
length(stats::fitted(y))
[1] 0

Пока все хорошо: ноль возвращается, потому что теперь R не использует stats::fitted для объекта класса Arima.

Далее в моем коде мне нужна одна функция из пакета forecast. Я не прикрепляю пакет, я просто загружаю его, используя обозначение ::. В моем коде ниже я буду загружать его напрямую, используя requireNamespace.

requireNamespace("forecast", quietly = TRUE)
length(stats::fitted(y))
[1] 10

И вдруг одна и та же команда возвращает другой результат. Я понимаю, почему это происходит (и я надеюсь, что я говорю это правильно): при загрузке пакета forecast новый метод для универсальной функции fitted (а именно fitted.Arima) загружается в пространство имен, что приводит к другому результату .

Для меня это поведение довольно раздражает: есть ли способ выбрать конкретный метод для fitted? Я прочитал эту главу , но не понял, как обойти эту проблему.

Я также пытался выгрузить пакет forecast из пространства имен, но безуспешно:

unloadNamespace("forecast")
length(stats::fitted(y))
[1] 10

Кажется, что после загрузки пакета я не могу использовать старый метод fitted. Мне интересно, как справиться с этими ситуациями.

EDIT

Как указано в комментариях после unloadNamespace("forecast") я получаю это

isNamespaceLoaded("forecast")
[1] FALSE

Но установленный methods по-прежнему включает fitted.Arima.

Ответы [ 2 ]

6 голосов
/ 18 апреля 2019

Я нашел эту тему от R devel.Брайан Рипли (из R Core) говорит:

Выгрузка пространства имен не отменяет его методы (и регистрация не имеет стека, поэтому R не знает, что там было раньше).

Затем поток отмечает, что ?unloadNamespace указывает на ?detach:

См. Комментарии в справке, чтобы узнать о некоторых проблемах с выгрузкой и перезагрузкой пространств имен.

, который в конечном итоге говорит следующее (выделение мое)

Если у пакета есть пространство имен, его отсоединение по умолчанию не выгружает пространство имен (и может даже не быть с unload = TRUE), а отсоединение обычно не выгружает динамически загруженный скомпилированный код (DLL).Кроме того, зарегистрированные методы S3 из пространства имен не будут удалены .

Поэтому я понимаю, что при загрузке пространства имен (например, с помощью ::) регистрируются методы S3,эти методы никогда не связаны с пространством имен, из которого они были загружены, и поэтому выгрузка пространства имен также не может отменить регистрацию методов.Единственный способ очистить их от methods() - перезапустить R.

Как заметил RolandASc , вы можете выбрать метод по умолчанию, используя stats:::fitted.default, если хотите избежатьотправить на fitted.Arima.

5 голосов
/ 22 апреля 2019

@ CalumВы совершенно правы, указав, что выгрузка пространства имен не приведет к удалению методов S3, зарегистрированных для универсального S3, определенного в другом пакете. Здесь, если вам интересно, более подробно рассмотрим, как и почему это так.

Когда загружен пакет прогноз , все его методы «регистрируются» в базах данных в различных пространствах имен. Следующее правило R заключается в том, что метод регистрируется в пространстве имен пакета, который определяет его общий S3. Так как универсальный fitted() определен в stats , именно здесь регистрируются новые методы, определенные прогнозом , в среде, называемой .__S3MethodsTable__.. При отключении или выгрузке прогноз пакет stats остается нетронутым (вероятно, это будет мудрое общее дизайнерское решение, если вы об этом думаете), с печальным последствием использования метода fitted.Arima (наряду со многими другие) остаются зарегистрированными в своем .__S3MethodsTable__.

Чтобы увидеть, что это так, взгляните на следующее:

isNamespaceLoaded("forecast")
## [1] FALSE
ls(stats:::.__S3MethodsTable__., pattern = "fitted")
## [1] "fitted.default"       "fitted.isoreg"        "fitted.kmeans"       
## [4] "fitted.nls"           "fitted.smooth.spline"

## Loading the forecast namespace registers new 'fitted' methods ...
requireNamespace("forecast", quietly = TRUE)
isNamespaceLoaded("forecast")
## [1] TRUE
ls(stats:::.__S3MethodsTable__., pattern = "fitted")
##  [1] "fitted.ar"              "fitted.Arima"           "fitted.arma"           
##  [4] "fitted.bats"            "fitted.default"         "fitted.ets"            
##  [7] "fitted.fracdiff"        "fitted.garch"           "fitted.gls"            
## [10] "fitted.glsStruct"       "fitted.gnls"            "fitted.gnlsStruct"     
## [13] "fitted.isoreg"          "fitted.kmeans"          "fitted.lagwalk"        
## [16] "fitted.lme"             "fitted.lmeStruct"       "fitted.lmList"         
## [19] "fitted.modelAR"         "fitted.nlmeStruct"      "fitted.nls"            
## [22] "fitted.nnetar"          "fitted.quantmod"        "fitted.smooth.spline"  
## [25] "fitted.tbats"           "fitted.tslm"            "fitted.values.quantmod"

## ... which are left behind even when the forecast namespace is unloaded
unloadNamespace("forecast")
isNamespaceLoaded("forecast")
## [1] FALSE
ls(stats:::.__S3MethodsTable__., pattern = "fitted")
##  [1] "fitted.ar"              "fitted.Arima"           "fitted.arma"           
##  [4] "fitted.bats"            "fitted.default"         "fitted.ets"            
##  [7] "fitted.fracdiff"        "fitted.garch"           "fitted.gls"            
## [10] "fitted.glsStruct"       "fitted.gnls"            "fitted.gnlsStruct"     
## [13] "fitted.isoreg"          "fitted.kmeans"          "fitted.lagwalk"        
## [16] "fitted.lme"             "fitted.lmeStruct"       "fitted.lmList"         
## [19] "fitted.modelAR"         "fitted.nlmeStruct"      "fitted.nls"            
## [22] "fitted.nnetar"          "fitted.quantmod"        "fitted.smooth.spline"  
## [25] "fitted.tbats"           "fitted.tslm"            "fitted.values.quantmod"

(Для связанных вопросов и ответов, см. Здесь .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...