【问题标题】:How to export new generic function for new S3 class?如何为新的 S3 类导出新的通用函数?
【发布时间】:2016-03-21 14:31:50
【问题描述】:

我定义了一个新函数 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)

为什么会这样,以及如何使该功能在包中可用?我怀疑我犯了一些小错误。

【问题讨论】:

  • 定义一个默认方法?

标签: r package r-s3


【解决方案1】:

当您使用 myS3 类的对象调用 work_with_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 方法并将其导出。

【讨论】:

  • 所以基本上是关于@export 标签的位置,对吧?
猜你喜欢
  • 2022-08-19
  • 2023-03-13
  • 2012-10-21
  • 1970-01-01
  • 2020-07-11
  • 2020-11-16
  • 2017-02-08
  • 1970-01-01
  • 2011-12-20
相关资源
最近更新 更多