Как экспортировать новую универсальную функцию для нового класса S3?
Я определяю новую функцию work_with_myS3
который должен работать с моим новым классом S3 myS3
:
work_with_myS3 = function (x) {
UseMethod("work_with_myS3", x)
}
work_with_myS3.myS3 = function(x) {
some code
}
Когда я получаю это в моем обычном сеансе R (я использую RStudio), он ведет себя точно так, как ожидалось. Когда я кормлю myS3
объект, это работает; когда я кормлю что-то странное, оно выдает ошибку:
> work_with_myS3(123)
Error in UseMethod("work_with_myS3", x) :
no applicable method for 'work_with_myS3' applied to an object of class "c('double', 'numeric')"
Однако, когда я включаю это в свой пакет, собираю его, перезагружаю и пытаюсь вызвать его:
Error: could not find function "work_with_myS3"
Страница справки работает нормально, хотя, позвонив ?work_with_myS3
, Вот как я это документирую devtools::document()
:
#' Do stuff with myS3
#'
#' What it does
#' @import dplyr
#' @param x object of class myS3
#' @method work_with_myS3 myS3
#' @export
Также есть запись в пространстве имен:
S3method(work_with_myS3,myS3)
Почему это так, и как сделать функцию доступной в пакете? Я подозреваю, что совершаю какую-то тривиальную ошибку.
1 ответ
Когда вы звоните work_with_myS3
с объектом класса myS3
UseMethod
Функция ищет:
work_with_myS3.myS3
или жеwork_with_myS3.default
Поэтому вам нужно экспортировать work_with_myS3.myS3
, так
#' @export
work_with_myS3.myS3 = function(x) {
## do stuff
}
В качестве альтернативы, вы можете определить default
метод и экспортировать это.