16

我正在开发一个具有功能的包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时,在执行where is of classforecast.midas_r时不会调用。我应该如何解决这个问题?forecast(object)objectmidas_r

4

3 回答 3

8

我不确定是否有一个简单的解决方案。正如其他人所说,使用它可能最容易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)

我意识到mean它是一个函数,base但我已经测试了它以在其他地方修改通用函数以给它们一个新方法,所以它也应该扩展到你更一般的情况。

于 2013-08-31T19:25:22.227 回答
5

这里的问题是您对forecast泛型的定义掩盖了预测包中的定义,并且您的方法与您的泛型相关联,而不是与预测包泛型相关联;这只是定义同名函数的两个包的复杂实例。解决方案是咬紧牙关,并 Depend: on forecast,或者在命令行并且您的包和预测都附加时完全解析函数mypackage::forecast(),或者 Import: forecast 但不使最终用户可以使用通用预测,除非具有它们require(forecast)(如果功能以某种方式对您的包来说是外围的,这可能是合适forecast的,例如,当以 2D 绘图时以 3D 绘图就足够了)。

值得一提的是,PkgB 中的 S4 方法在从 PkgA 导入的 S4 泛型上定义和导出隐式向用户公开了 S4 泛型,因此即使在 PkgB 的说明文件中指定 Imports: PkgA 也可以使用泛型。

于 2013-08-29T16:01:16.450 回答
3

一种可能的解决方案是强制导出 forecast.midas_r。NAMESPACE这意味着每次手动更新export(forecast.midas_r)check("yourpackagename")

这样做是为了让包裹预测forecast.midas_r可见。如果未导出,并且仅存在于包的命名空间中,则在加载包预测时,泛型将被包预测中的相同函数覆盖。因此,当在未知对象上调用时,R 在包预测和一般工作区中查找相应的方法。由于是私有方法,R 没有找到它并产生错误。forecast.midas_rforecastforecastforecast.midas_r

这不是一个完美的解决方案,因为您需要手动更新NAMESPACE,但它仍然是一个解决方案。

于 2013-08-29T16:01:30.503 回答