在R包中使用S3覆盖原语时导出错误

时间:2016-11-29 18:32:59

标签: r r-package

我正在尝试在名为var rx = /^[0-9]{7,10}_(LM|LI|AQ)_[A-Za-z]+$/gm; console.log("0100455_LM_Izaguirre".match(rx)); console.log("0100455_YM_Izaguirre".match(rx)); console.log("0100455_AQ_Izaguirre".match(rx));的包中创建一个S3方法。这是R中的原语,但我的包中应该有一个同名的S3。

我有以下文件dimnames

dimnames.r

然后我从中创建一个包(在#' S3 overwriting primitive #' #' @param x object #' @export dimnames = function(x) { UseMethod("dimnames") } #' title #' #' @export dimnames.data.frame = function(x) { dimnames.default(x) } #' title #' #' @export dimnames.list = function(x) { lapply(x, dimnames) } #' title #' #' @export dimnames.default = function(x) { message("in S3 method") base::dimnames(x) } 中):

R=3.3.2

然后检查包

> package.skeleton("rpkg", code_files="dimnames.r")
> setwd("rpkg")
> devtools::document() # version 1.12.0

我得到以下输出(以及其他消息):

  

警告:未找到声明的S3方法'dimnames.default'

     

警告:未找到声明的S3方法'dimnames.list'

加载包并检查其内容,R CMD build rpkg R CMD check rpkg_1.0.tar.gz 导出dimnames.data.frame,而dimnames.default则导出dimnames.list。这对我来说没有意义。据我了解,我正确地宣布出口。此外,NAMESPACE文件对我来说很好看:

S3method(dimnames,data.frame)
S3method(dimnames,default)
S3method(dimnames,list)
export(dimnames)

为什么这不起作用,以及如何解决?

(奖励积分:为什么我们在should not be needed#' title的情况下在S3实施中需要roxygen=5.0.1?)

1 个答案:

答案 0 :(得分:1)

只有在希望用户能够直接访问它们时才会导出S3方法。如果总是通过泛型调用它们,则无需导出它们。

R CMD check的问题可能是由于为dimnames定义了您自己的通用。通常,只需定义方法并利用R中已有的原语泛型。从dimnames中删除dimnames.r泛型。

为新类添加方法应该没有问题,但是对于R dimnames处理自身的现有类,可能会尝试覆盖dimnames的功能。