在R中创建一个依赖于data.table的包

Uso*_*obi 5 r data.table

我必须制作一个取决于包data.table的R包.但是,如果我要执行一个功能,例如包中的下一个功能

randomdt <- function(){
    dt <- data.table(random = rnorm(10))
    dt[dt$random > 0]
}
Run Code Online (Sandbox Code Playgroud)

函数[将使用data.frame的方法而不是data.table,因此错误

Error in `[.data.frame`(x, i) : undefined columns selected
Run Code Online (Sandbox Code Playgroud)

会出现.通常这可以通过使用get('[.data.table')或类似的方法(package::function最简单)解决,但似乎不起作用.毕竟,[是一个原始的功能,我不知道它的方法是如何工作的.

那么,如何[从我的包中调用data.table 函数呢?

TAR*_*man 5

根据MichaelChirico的一些反馈以及ArunSoheil的评论进行了更新.

粗略地说,您可以考虑两种方法.第一种是在你的包本身中构建依赖,而第二种是在你的R代码中包含测试存在的行data.table(如果没有找到,甚至可能自动安装它).

data.table FAQ 6.9专门针对这一点,并指出,你可以确保data.table你的包被适当地加载方式:

要么i)在DESCRIPTION文件的Depends:字段中包含data.table,要么ii)在DESCRIPTION文件的Imports:字段中包含data.table并在NAMESPACE文件中包含import(data.table).

正如评论中所指出的,这是许多包中常见的R行为.

另一种方法是创建特定的代码行,以测试并导入所需的包作为代码的一部分.考虑到使用上面提供的选项的优雅,我认为这不是理想的解决方案.但是,这在技术上是可行的.

执行此操作的一种简单方法是使用requirelibrary检查是否存在data.table,如果无法附加错误则抛出错误.您甚至可以使用一组简单的条件语句来运行,install.packages以便在加载它们时失败.

谢毅辉(knitr fame)有一篇很好的帖子讲述了这里libraryrequire 这里之间的区别,并且只是library在包装对于即将推出的代码绝对必要的情况下使用的强有力的案例.