gpt4 book ai didi

r - 如何在不使用 Depends 或 library() 的情况下使用另一个包中的 S3 方法,该包在其命名空间中使用 export 而不是 S3method

转载 作者:行者123 更新时间:2023-12-03 23:52:09 25 4
gpt4 key购买 nike

我目前正在研究 R 包,并尝试遵循 Hadley Wickham 在 http://r-pkgs.had.co.nz 上提供的最佳实践指南。 .作为其中的一部分,我的目标是在描述文件的 Imports 部分而不是 Depends 中包含所有包依赖项,因为我同意不会不必要地改变全局环境的理念(许多 CRAN 和 Bioconductor 包不这样做)似乎没有遵循)。

我想在我的包函数之一中使用 Bioconductor 包 rhdf5 中的函数,特别是 h5write() .我现在遇到的问题是它没有在它的 NAMESPACE 中声明它的 S3 方法。它们是使用(例如)声明的

export(h5write.default)
export(h5writeDataset.matrix)

而不是
S3method(h5write, default)
S3method(h5writeDataset, matrix)

通用 h5write 定义为:
h5write <- function(obj, file, name, ...) {
res <- UseMethod("h5write")
invisible(res)
}

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

据我所知,有以下三种解决方案:
  • 使用 Depends而不是 Imports在描述文件中。
  • 使用 library("rhdf5")require("rhdf5")在相关函数的代码中。
  • 修改rhdf5 的NAMESPACE 文件以使用S3methods()而不是 export() .

  • 所有这些都有缺点。选项 1 意味着即使我的包中的相关函数从未被调用,包也被加载并附加到全局环境中。选项 2 表示使用 library在一个包中,它再次将包附加到全局环境,并且根据 Hadley Wickham 的指导方针也被弃用。选项 3 意味着依赖其他包作者在 Bioconductor 上更新他们的包,也意味着不再导出 S3 方法,这反过来可能会破坏依赖显式调用它们的其他包。

    我错过了另一种选择吗?我在 StackOverflow 上的其他地方看过,发现以下有些相关的问题 Importing S3 method from another package
    How to export S3 method so it is available in namespace?但没有什么能直接解决我的问题。值得注意的是,与这两个中的第一个的主要区别在于泛型和方法都在同一个包中,但问题是使用 export而不是 S3method .

    重现错误的示例代码(无需创建包):
    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") 安装.

    最佳答案

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

    备注 :这假设 test.h5文件已经存在。

    #' @importFrom rhdf5 h5write.default
    #' @importFrom rhdf5 h5write
    #' @export
    myFun <- function(){
    h5write(1:4, "test.h5", "test")
    }

    我也放了我自己的小包装来演示这个 here .

    关于r - 如何在不使用 Depends 或 library() 的情况下使用另一个包中的 S3 方法,该包在其命名空间中使用 export 而不是 S3method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30778718/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com