Как экспортировать новую универсальную функцию для нового класса 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 Функция ищет:

  1. work_with_myS3.myS3 или же
  2. work_with_myS3.default

Поэтому вам нужно экспортировать work_with_myS3.myS3, так

#' @export
work_with_myS3.myS3 = function(x) {
  ## do stuff
}

В качестве альтернативы, вы можете определить default метод и экспортировать это.

Другие вопросы по тегам