当我编写自己的R软件包时,似乎无法正确导入其他软件包。

40

好的,这是我第一次尝试编写一个R软件包,但现在卡住了。下面是我创建软件包的方式:

package.skeleton("pkg",code_files=some.filenames)
roxygenize("okg")

我正在使用roxygen2,并在我的"pkg-package.R"文件中使用以下导入:

@import data.table zoo lubridate

接下来我从终端运行:

R CMD build pkg
R CMD check pkg
R CMD install pkg

在检查阶段,我收到以下警告:

**为惰性加载准备软件包
警告:在加载“lubridate”时替换以前的导入‘hour’
警告:在加载“lubridate”时替换以前的导入‘mday’
警告:在加载“lubridate”时替换以前的导入‘month’
警告:在加载“lubridate”时替换以前的导入‘wday’
警告:在加载“lubridate”时替换以前的导入‘week’
警告:在加载“lubridate”时替换以前的导入‘yday’
警告:在加载“lubridate”时替换以前的导入‘year’
**帮助
* 安装帮助索引
**正在构建软件包索引...
**测试已安装的软件包是否可以加载
警告消息:
1: 在加载“lubridate”时替换以前的导入‘hour’
2: 在加载“lubridate”时替换以前的导入‘mday’
3: 在加载“lubridate”时替换以前的导入‘month’
4: 在加载“lubridate”时替换以前的导入‘wday’
5: 在加载“lubridate”时替换以前的导入‘week’
6: 在加载“lubridate”时替换以前的导入‘yday’
7: 在加载“lubridate”时替换以前的导入‘year’

我真的不知道如何理解这些警告,但它们似乎是命名空间中正在覆盖某些内容的典型警告。无论如何,我能够安装该软件包,但是在尝试使用它时发生了以下情况:

library(pkg)
覆盖了POSIXt、Date和difftime的+和-方法
警告消息:
1: 在加载“lubridate”时替换以前的导入‘hour’
2: 在加载“lubridate”时替换以前的导入‘mday’
3: 在加载“lubridate”时替换以前的导入‘month’
4: 在加载“lubridate”时替换以前的导入‘wday’
5: 在加载“lubridate”时替换以前的导入‘week’
6: 在加载“lubridate”时替换以前的导入‘yday’
7: 在加载“lubridate”时替换以前的导入‘year’
d <- my.function(arg1, arg2)
错误:MATCH(x,x)中找不到函数“MATCH”

使用traceback(),我发现这是在调用merge.zoo()时生成的。因此,我尝试手动在我的R会话中加载zoo,然后,函数可以正确运行而不会出现错误消息。

我尝试手动更改“pkg-package.R”文件以及NAMESPACE中的导入排序。基于我在其他地方找到的内容,我没有将任何Imports或Depends添加到DESCRIPTION中。求助?


1
我建议将这些软件包放入您的DESCRIPTION中的Depends - mathematical.coffee
2个回答

43

这些警告是因为data.table和lubridate都定义了一个hour等符号; 参见 data.table::hourlubridate::hour。您可以通过仅导入所需的lubridate/data.table函数,而不是整个包来避免这种情况; 标准NAMESPACE文件将包含:

importFrom(lubridate, hour)

例如,使用Roxygen2标记:

@importFrom lubridate hour
MATCH问题可能是因为merge分配不正确,可能是因为zoo应该在其名称空间中使用S3method(merge, zoo)而不是export(merge.zoo),如《编写R扩展》1.6.2所述。这里的解决方案是联系zoo的维护者,packageDescription('zoo')$Maintainer(维护者对R足够熟悉,我感觉我诊断错误了...)。

这是一个有用的答案,但只是一个跟进问题。如果我只导入一个单独的函数,比如“hour”,我是否也需要导入它的所有内部或潜在私有函数?或者importFrom会知道导入任何私有函数或内部依赖项吗? - krishnab
2
@krishnab 函数首先在自身环境中查找它们使用的符号,然后在定义该函数的环境中查找,因此 data.table::hour 使用的 data.table 函数将被自动找到。 - Martin Morgan
2
当您需要导入多个包以访问特定对象类并且它们存在名称冲突时会发生什么?我在使用 spatstat 和 raster(area、rotate、shift)时遇到了这个问题。我不能使用 importFrom,因为我从两个包中使用了众多函数并需要包类。有没有一种方法可以屏蔽与 spatstat 冲突的三个栅格函数?值得注意的是,仅使用 DESCRIPTION 中的 depends 并不起作用。 - Jeffrey Evans
2
您还可以使用import except来导入除了某个函数之外的所有函数:https://dev59.com/JlQK5IYBdhLWcg3wbPP7 - Mikko

1
作为对于MATCH错误的临时解决方案,我已经成功地将zoo包列在了该包的DESCRIPTION文件的Depends部分中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接