Использование метода S3 из незагруженного пакета R

Рассмотрим на примере метода months для типа numeric из пакета lubridate. При загрузке пакета все работает как положено:

library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date
months(3)
#> [1] "3m 0d 0H 0M 0S"

Создана 28 октября 2018 г. с помощью пакета reprex (v0.2.1)

Однако я не могу получить доступ к методу, когда пакет не загружен.

lubridate::months(3)
#> Error: 'months' is not an exported object from 'namespace:lubridate'

Создана 28 октября 2018 г. с помощью пакета reprex (v0.2.1)

Я не хочу вызывать функцию с :::, так как это плохая практика. Предполагая, что я не хочу загружать пакет, что я могу сделать?


person Lorenz Walthert    schedule 28.10.2018    source источник
comment
months от base.   -  person markus    schedule 28.10.2018
comment
@markus Но в базовом пакете нет метода months() для числовых значений; months.numeric() действительно предоставляется lubridate. Попробуйте в новом сеансе R months(3); вы получите Error in UseMethod("months") : no applicable method for 'months' applied to an object of class "c('double', 'numeric')"   -  person duckmayr    schedule 28.10.2018
comment
@duckmayr Это хороший момент. Не знал об этом.   -  person markus    schedule 28.10.2018
comment
Почему вы не хотите загружать пакет?   -  person Hugh    schedule 28.10.2018
comment
@ Хью, потому что сценарии большие, и я не хочу загромождать пространство имен, поэтому я решил загрузить только несколько пакетов. Может быть, пора превратить это в пакет в любом случае. Надеюсь, проблема все же не сохранится.   -  person Lorenz Walthert    schedule 28.10.2018


Ответы (2)


Вот как это работает, но вы можете скрыть ::: в определении функции, чтобы ваш основной код мог просто использовать months.

months.numeric <- lubridate:::months.numeric

months(3)
## [1] "3m 0d 0H 0M 0S"
person G. Grothendieck    schedule 28.10.2018

Альтернатива G. Ответ Гротендика заключается в использовании getFromNamespace():

months.numeric <- getFromNamespace("months.numeric", "lubridate")
months(3)
# [1] "3m 0d 0H 0M 0S"
person duckmayr    schedule 28.10.2018