gpt4 book ai didi

r - 在 R 中,如何从另一个包中的一个包扩展泛型方法?

转载 作者:行者123 更新时间:2023-12-03 14:55:30 25 4
gpt4 key购买 nike

我有一个包裹PackageA具有通用功能:

#' doWork
#'
#' Do some work!
#'
#' @export
setGeneric(
"doWork",
function(x) {

standardGeneric("doWork")
})

setMethod(
"doWork",
signature = c("numeric"),
definition = function(x) {

x == 10 # Some logic...
}

PackageB , 这取决于 PackageA , 我想在 doWork 中添加更多方法:
#' @import PackageA
setMethod(
"doWork",
signature = c("character"),
definition = function(x) {

length(x) == 1 && x == "10" # Some more logic...
}

这行得通。但是,这意味着 PackageB 的用户还必须 library(PackageA) .

这失败了:
library(PackageB)

doWork("10") # Fails!

这有效:
library(PackageA)
library(PackageB)

doWork("10")

我想使用 PackageA 中的泛型在 PackageB ,但不需要 PackageA加载以仅使用 PackageB 中的方法.

我怎样才能做到这一点?

最佳答案

这实际上已记录在案,但不是很清楚;见章节1.5.6Writing R Extensions .

诀窍是从 PackageA 导入泛型然后从 PackageB 重新导出.使用 roxygen注释,这看起来像:

#' @importMethodsFrom PackageA doWork
#' @export
setMethod(
"doWork",
signature = c("character"),
definition = function(x) {

length(x) == 1 && x == "10" # Some more logic...
})

当您调用 devtools::document() , 这将失败,除非您首先加载 PackageA (调用 library(PackageA))。

然而,一旦建成, PackageA不需要:
> library(PackageB)
> showMethods("doWork")
Function: doWork (package PackageA)
x="character"
x="numeric"

作为引用,自动生成的 NAMESPACE文件看起来像:
exportMethods(doWork)
importMethodsFrom(PackageA, doWork)

这种方法不会产生关于命名冲突等的警告,所以它似乎是“kosher”。

关于r - 在 R 中,如何从另一个包中的一个包扩展泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31317366/

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