如何为新的S3类导出新的通用函数?

时间:2016-03-21 14:31:51

标签: r package r-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 个答案:

答案 0 :(得分:1)

当您使用类work_with_myS3的对象调用myS3时,UseMethod函数会查找:

  1. work_with_myS3.myS3
  2. work_with_myS3.default
  3. 因此您需要导出work_with_myS3.myS3,所以

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

    或者,您可以定义default方法并导出该方法。