首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用来自另一个包的S3方法,该包在其名称空间中使用导出而不是S3method,而不使用using或library()

如何使用来自另一个包的S3方法,该包在其名称空间中使用导出而不是S3method,而不使用using或library()
EN

Stack Overflow用户
提问于 2015-06-11 10:49:53
回答 1查看 1.3K关注 0票数 15

目前,我正在开发一个R包,并试图遵循http://r-pkgs.had.co.nz的Hadley提供的最佳实践指南。作为其中的一部分,我的目标是在描述文件的Imports部分中拥有所有的包依赖项,而不是依赖项,因为我同意不不必要地改变全局环境的理念(许多CRAN和生物导体包似乎没有遵循这种理念)。

我想在我的包函数中使用生物导体包rhdf5中的函数,特别是h5write()。我现在遇到的问题是,它在其命名空间中没有将其S3方法声明为此类方法。它们是使用(例如)声明的

代码语言:javascript
复制
export(h5write.default)
export(h5writeDataset.matrix)

而不是

代码语言:javascript
复制
S3method(h5write, default)
S3method(h5writeDataset, matrix)

泛型h5write被定义为:

代码语言:javascript
复制
h5write <- function(obj, file, name, ...) {
res <- UseMethod("h5write")
  invisible(res)
}

实际上,这意味着调用rhdf5 5::h5写失败,因为没有注册适当的h5write方法。

据我所见,有三种解决办法:

  1. 在描述文件中使用Depends而不是Imports
  2. 在相关函数的代码中使用library("rhdf5")require("rhdf5")
  3. 修改rhdf5的命名空间文件以使用S3methods()而不是export()

所有这些都有缺点。选项1意味着包被加载并附加到全局环境,即使我的包中的相关函数从未被调用。选项2意味着在包中使用library,虽然它再次将包附加到全局环境,但也不推荐使用Hadley Wickham的指导方针。选项3将意味着依赖另一个包创建者更新他们的包在生物导体上,还意味着不再导出S3方法,这反过来会破坏依赖于显式调用它们的其他包。

我错过了另一种选择吗?我在其他地方查看了StackOverflow,发现了以下一些与从另一个包导入S3方法如何导出S3方法,使其在命名空间中可用?有关的问题,但没有任何问题直接解决我的问题。值得注意的是,与这两种方法中的第一种不同的是,泛型和方法都在同一个包中,但问题是使用export而不是S3method

再现错误的示例代码(不需要创建包):

代码语言:javascript
复制
loadNamespace("rhdf5")
rdhf5::h5write(1:4, "test.h5", "test")

Error in UseMethod("h5write") : 
no applicable method for 'h5write' applied to an object of class
"c('integer', 'numeric')

或者,在https://github.com/NikNakk/s3issuedemo中有一个框架包,它提供一个函数demonstrateIssue()来复制错误消息。它可以使用devtools::install_github("NikNakk/s3issuedemo")安装。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-11 13:47:01

这里的关键是除了要使用的泛型之外,还要导入特定的方法。下面是如何让它用于默认方法的方法。

注意事项:这假定test.h5文件已经存在。

代码语言:javascript
复制
#' @importFrom rhdf5 h5write.default
#' @importFrom rhdf5 h5write
#' @export
myFun <- function(){
    h5write(1:4, "test.h5", "test")
}

我还安装了自己的小包来演示这个这里

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

https://stackoverflow.com/questions/30778718

复制
相关文章

相似问题

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