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

2024-01-05

我正在尝试在我的包中创建一个名为的 S3 方法dimnames。这是R中的原语,但我的包中应该有一个同名的S3。

我有以下文件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

然后检查包裹

R CMD build rpkg
R CMD check rpkg_1.0.tar.gz

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

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

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

装载包裹并检查其内容,dimnames.data.frame被导出时dimnames.default and dimnames.list不是。这对我来说没有意义。据我了解,我正确申报了出口。另外,NAMESPACE文件对我来说看起来不错:

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

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

(奖励积分:为什么我需要#' title在 S3 实现中,当它们不应该需要 https://stackoverflow.com/a/22598266/538603 with roxygen=5.0.1?)


仅当希望用户能够直接访问 S3 方法时才会导出它们。如果它们始终通过泛型调用,则无需导出它们。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 R 包中使用 S3 覆盖原语时出现导出错误 的相关文章

随机推荐