5

我对错误感到困惑

found an S4 version of 'simulate' so it has not been imported correctly 

我编写了一个 R 包,其中包含一个作为 S3 方法的模拟()方法的定义。因为已经定义了模拟的泛型,所以我只定义了一个模拟.myclass(我的例子中是模拟.fitContinuous)。

该软件包还依赖于另一个具有 S4 版本模拟的软件包。加载我的包时,我收到上面的 S4 版本错误。我不确定是什么导致了错误。

通过从 github获取包的可重现示例,或者执行

require(devtools) 
install_github("pmc", "cboettig")
require(pmc)

要从头开始重现此错误:使用最少的说明文件创建一个新包。包括说明进口:哎哟。创建一个 NAMESPACE 并添加 imports(ouch) 和 S3method(simulate, test)。创建 R 目录,添加一个简单的 R 脚本(我已经包含了 roxygen 文档,它将生成我刚才提到的 NAMESPACE,但是这个错误也可以在没有 devtools/roxygen 的情况下创建):

#' simulate
#' 
#' a test for s3/s4 conflicts
#' @param object who cares?
#' @param nsim guess.
#' @param seed yup
#' @param ... other parameters we will just ignore
#' @return something
#' @method simulate test
#' @S3method simulate test
#' @import ouch
simulate.test <- function(object, nsim = 1, seed = NULL, ...){
  message("This test worked")
}

安装包(如果你愿意,请先用 devtools 记录),然后你会得到错误。

到目前为止,我最好的解决方案是从 NAMESPACE 中删除 S3method 行,并导出完整的函数模拟.test。这将通过检查并在没有警告的情况下安装,但显然是一个较差的解决方案。

一个不同的解决方案是在依赖和导入中添加 ouch,并正确记录 S3 方法(如上)。然后一切都按预期工作,但警告消息仍然存在。

4

1 回答 1

4

simulate是在 中定义的 S3 泛型stats,因此根据“编写 R 扩展”的第 1.6.2 节(示例不清楚 - 中定义的泛型有例外base),您的 NAMESPACE 文件应该具有

importFrom(stats, simulate)
S3method(simulate, fitContinuous)

关于“找到 S4 方法”的业务似乎反映了何时发现问题——尝试将 S4 方法添加到不可见的 S3 泛型(我猜“它”指的是泛型simulate)。

于 2012-01-16T19:37:19.923 回答