mpi*_*tas 15 r devtools roxygen2
我正在开发一个具有该功能的包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),...) {
Run Code Online (Sandbox Code Playgroud)
现在,当forecast未加载包时,一切都按预期工作.但是,当我打开包forecast,然后forecast.midas_r不叫,做的时候forecast(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)
}
Run Code Online (Sandbox Code Playgroud)
然后package.skeleton("newPkg").将mean.R包含上述内容的文件放在/R包的目录中.
确保您位于以下1级目录中
roxygenize("newPkg", roxygen.dir="newPkg", copy.package=F, unlink.target=F)
Run Code Online (Sandbox Code Playgroud)
现在
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)
Run Code Online (Sandbox Code Playgroud)
我意识到它mean是一个函数,base但我已经测试过这个函数用于修改其他地方的泛型函数以给它们一个新的方法,因此它应该扩展到更一般的情况.
这里的问题是您对forecast泛型的定义掩盖了预测包中的定义,并且您的方法与您的泛型而不是与预测包中的泛型相关联;这只是定义相同功能的两个程序包的复杂实例。解决的办法是硬着头皮,然后依靠Depend:预测,或者在命令行中同时附加了软件包和预测时完全解析该功能mypackage::forecast(),或者Import:预测,但不让最终用户通用该预测,除非通过它们require(forecast)(如果forecast功能在某种程度上对于您的软件包来说是外围的,例如,以3D进行绘制,而以2D进行绘制就足够了)。
就其价值而言,在PkgB中定义的S4方法并在从PkgA导入的S4泛型上导出后,会向用户隐式公开S4泛型,因此即使在PkgB的Description文件中指定了Imports:PkgA,该泛型也可用。
一种可能的解决方案是强制导出forecast.midas_r。这意味着每次之后NAMESPACE都要手动更新。export(forecast.midas_r)check("yourpackagename")
其作用是使forecast.midas_r包裹预测可见。如果forecast.midas_r未导出,并且仅存在于包的命名空间中,则在加载包Forecast时,泛型将被包Forecastforecast中的相同函数覆盖。因此,当在未知对象上调用 时,R 会在包预测和通用工作区中查找相应的方法。由于是一个私有方法,R 找不到它并产生错误。forecastforecast.midas_r
这不是一个完美的解决方案,因为您需要手动更新NAMESPACE,但它仍然是一个解决方案。