我正在开发具有功能forecast.myclass的软件包。我希望该功能与forecast包配合使用。即加载forecast软件包时,代码forecast(object)应从我的软件包中调用forecast.myclass

因为我只需要包forecast中的forecast通用定义,并且我不使用包forecast中的任何其他函数,所以我不愿意将其包含在Depends中。因此,我通过以下方式在包中定义了泛型:

##'
##' @export
forecast <- function(object,...) UseMethod("forecast")

##' @rdname forecast.midas_r
##' @method forecast midas_r
##' @export
forecast.midas_r <- function(object,newdata=NULL,method=c("static","dynamic"),insample=get_estimation_sample(object),...) {


现在,当未加载软件包forecast时,一切都会按预期工作。但是,当我加载程序包forecast时,执行forecast.midas_rforecast(object)不会被调用,其中object是类midas_r。我应该如何解决这个问题?

最佳答案

我不确定对此是否有简单的解决方案。正如其他人所说,使用Depends解决此问题可能是最简单的方法,而不是重新定义通用方法。

这是一个对我有用的简单示例。它与您的解决方案基本相同,但是声明@export意味着您不需要手动更新NAMESPACE文件。

##' @name mean
##' @export mean.newClass
##'
##' @method mean newClass
##'
##' @title mean for \code{newClass} object
##' @param x A \code{newClass} object
##' @param ... Additional arguments
##'
mean.newClass <- function(x, ...){
  stopifnot(class(x)=="newClass")
  return(42)
}


然后package.skeleton("newPkg")。将具有以上内容的文件mean.R放在包的目录/R中。

确保您位于下面的1级目录中,然后

roxygenize("newPkg", roxygen.dir="newPkg", copy.package=F, unlink.target=F)


现在

library(devtools)
dev_mode(on=TRUE) ### don't want to have to uninstall the package later
install_local("newPkg")
library(newPkg)
x <- c(1,2)
class(x) <- "newClass"
stopifnot(mean(x)==42)
stopifnot(mean(unclass(x))==1.5)


我意识到meanbase中的一个函数,但是我已经测试了此函数是否可以在其他地方修改通用函数以为其提供新方法,因此它也应扩展到您更一般的情况。

关于r - 如何从另一个软件包扩展S3方法而不加载该软件包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18513607/

10-11 07:50