【问题标题】:Making a package in R that depends on data.table在 R 中制作一个依赖于 data.table 的包
【发布时间】:2015-10-09 13:11:35
【问题描述】:

我必须制作一个依赖包data.table的R包。但是,如果我要做一个功能,例如包中的下一个功能

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

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

Error in `[.data.frame`(x, i) : undefined columns selected

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

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

【问题讨论】:

  • 你可能必须确保在你的包被加载时data.table被加载。
  • 在您的Description 文件中添加Depends: data.table
  • 你读过FAQ 6.9吗?
  • Arun 搞定了,但提醒一下,这在其他包中很常见,请使用 xlsx,这取决于 rJavaxlsxjars;每次运行library(xlsx)require(xlsx) 时,您都会看到R 也附加了这些包。
  • 之前遇到这个问题的时候,我走的是描述文件中Depends:的路线。这对我来说似乎是最简单的解决方案。

标签: r data.table


【解决方案1】:

根据MichaelChirico 和 cmets 的一些反馈进行了更新,ArunSoheil

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

data.tableFAQ 在 6.9 中专门解决了这个问题,并声明您可以通过以下方式确保您的包正确加载 data.table

i) 在您的说明文件的 Depends: 字段中包含 data.table,或 ii) 在您的说明文件的 Imports: 字段中包含 data.table 并在您的 NAMESPACE 文件中的 import(data.table)。

如 cmets 中所述,这是许多包中常见的 R 行为。

另一种方法是创建特定的代码行来测试和导入所需的包作为代码的一部分。鉴于使用上面提供的选项的优雅,我认为这不是理想的解决方案。不过,这在技术上是可行的。

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

Yihui Xie(以 knitr 为名)有一篇关于 libraryrequire here 之间区别的精彩帖子,并为仅使用 library 提供了强有力的理由,因为该软件包对于即将到来的产品绝对必不可少代码。

【讨论】:

  • 为什么投反对票?评论一下如何改进答案,也许?
  • @MichaelChirico 一组公平的建议。我已努力对此进行扩展,并将 Arun 和 Soheil 提到的一些项目联系起来。如果您有任何其他建议,我很乐意进一步修改。
猜你喜欢
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2012-04-26
  • 2018-04-07
相关资源
最近更新 更多