在编写自己的 R 包时,我似乎无法正确导入其他包
Posted
技术标签:
【中文标题】在编写自己的 R 包时,我似乎无法正确导入其他包【英文标题】:When writing my own R package, I can't seem to get other packages to import correctly 【发布时间】:2012-05-06 16:51:26 【问题描述】:好的,第一次尝试编写 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”时替换之前的导入“小时” 警告:加载“lubridate”时替换之前的导入“mday” 警告:加载“lubridate”时替换之前的导入“月” 警告:加载“lubridate”时替换之前的导入“wday” 警告:加载“lubridate”时替换之前的导入“周” 警告:加载“lubridate”时替换之前的导入“yday” 警告:加载“lubridate”时替换之前的导入“年份” ** 帮助* 安装帮助索引 ** 构建包索引 ... ** 测试是否可以加载已安装的包 警告信息: 1:加载“lubridate”时替换之前导入的“小时” 2:加载“lubridate”时替换之前的导入“mday” 3:加载“lubridate”时替换之前导入的“月” 4:加载“lubridate”时替换之前的导入“wday” 5:加载“lubridate”时替换之前导入的“week” 6:在加载“lubridate”时替换之前导入的“yday” 7:加载“lubridate”时替换之前导入的“year”
我真的不知道该怎么做,但它们看起来像是覆盖命名空间中的内容的典型警告。无论如何,我都可以安装该软件包,但是当我尝试使用它时会发生以下情况:
库(pkg) 覆盖 POSIXt、Date 和 difftime 的 + 和 - 方法 警告信息: 1:加载“lubridate”时替换之前导入的“小时” 2:加载“lubridate”时替换之前的导入“mday” 3:加载“lubridate”时替换之前导入的“月” 4:加载“lubridate”时替换之前的导入“wday” 5:加载“lubridate”时替换之前导入的“week” 6:在加载“lubridate”时替换之前导入的“yday” 7:加载“lubridate”时替换之前导入的“年份” d MATCH(x, x) 中的错误:找不到函数“MATCH”
使用 traceback(),我发现这是在调用 merge.zoo() 期间生成的。所以我尝试在我的 R 会话期间手动加载动物园,瞧,该功能正常工作而没有错误消息。
我已经尝试在“pkg-package.R”文件和 NAMESPACE 中手动更改导入的顺序。但是,根据我在其他地方找到的内容,我没有添加任何 Imports 或 Depends 到DESCRIPTION。帮忙?
【问题讨论】:
我建议将这些包放入您的Depends
DESCRIPTION
。
【参考方案1】:
警告是因为data.table和lubridate都定义了一个符号hour
等;见data.table::hour
和lubridate::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足够精通,我觉得我误诊了……)。
【讨论】:
这是一个有用的答案,但只是一个跟进。所以如果我只导入一个像“小时”这样的函数,我是否还需要导入它的所有内部函数或潜在的私有函数?或者importFrom
会知道导入任何私有函数或内部依赖项吗?
@krishnab 函数首先在自己的环境中查找它们使用的符号,然后在定义函数的环境中查找,因此会找到 data.table::hour 使用的 data.table 函数自动。
当您需要对多个包使用导入以访问特定对象类并且它们存在名称冲突时会发生什么?我正在使用 spatstat 和 raster (区域,旋转,移位)来解决这个问题。我不能使用 importFrom ,因为我使用了两者中的许多函数并且需要包类。有没有办法屏蔽与 spatstat 冲突的三个栅格函数?我应该注意,仅在DESCRIPTION中使用depends是行不通的。
您也可以使用导入,除了:***.com/questions/51899220/…【参考方案2】:
作为 MATCH 错误的临时解决方法,我已成功在包的 DESCRIPTION
文件的 Depends:
部分下列出了 zoo
包。
【讨论】:
以上是关于在编写自己的 R 包时,我似乎无法正确导入其他包的主要内容,如果未能解决你的问题,请参考以下文章
在构建 R 包时从另一个 Rcpp 函数调用 Rcpp 函数
错误 ['\+' 是在创建 R 包时以“\+”开头的字符串中无法识别的转义