首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R包中用S3覆盖原语时的导出错误

R包中用S3覆盖原语时的导出错误
EN

Stack Overflow用户
提问于 2016-11-29 18:32:59
回答 1查看 551关注 0票数 3

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

我有以下文件dimnames.r

代码语言:javascript
复制
#' 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中):

代码语言:javascript
复制
> package.skeleton("rpkg", code_files="dimnames.r")
> setwd("rpkg")
> devtools::document() # version 1.12.0

然后检查包裹

代码语言:javascript
复制
R CMD build rpkg
R CMD check rpkg_1.0.tar.gz

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

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

加载包并检查其内容时,dimnames.data.frame将被导出,而dimnames.defaultdimnames.list则不会导出。这对我来说毫无意义。据我所知,我正确地申报了出口。此外,NAMESPACE文件在我看来也不错:

代码语言:javascript
复制
S3method(dimnames,data.frame)
S3method(dimnames,default)
S3method(dimnames,list)
export(dimnames)

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

(额外的一点是:为什么我需要#' title在S3实现中,当他们使用roxygen=5.0.1进行should not be needed时?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-05 20:43:09

只有当希望用户能够直接访问S3方法时,才会导出它们。如果它们总是通过泛型调用,那么就没有必要导出它们。

R CMD check的问题可能是因为为dimnames定义了自己的泛型。通常,只定义方法并利用R中已经存在的基本泛型,从dimnames泛型中删除dimnames.r泛型。

为新类添加方法应该没有问题,但是对于R的dimnames自己处理的现有类,您可能会遇到一些问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40873221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档