在R中制作一个依赖于data.table的包

6

我需要制作一个依赖于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已经被加载。 - Jaap
2
在你的Description文件中添加Depends: data.table - Soheil
4
你看过FAQ 6.9吗? - Arun
Arun做得很好,但提醒一下,在其他软件包中也很常见,例如xlsx,它依赖于rJavaxlsxjars。每次运行library(xlsx)require(xlsx)时,你会发现R也会附加这些软件包。 - MichaelChirico
当我之前遇到这个问题时,我会选择在描述文件中使用Depends:的方法。对我来说,这似乎是最简单的解决方案。 - alexwhitworth
所以,如果我理解@Arun @MichaelChirico @Alex的话。Depends会将包data.table附加到搜索路径中,就像我所做的library(data.table)一样。由于它加载在搜索路径中,因此data.table命名空间也将在其下面的所有环境中可用。只要搜索路径有正确的顺序,这种策略就会奏效。 - Usobi
1个回答

6

根据MichaelChirico的反馈以及ArunSoheil的评论,更新内容如下:

大致上来说,你可以考虑两种方法。第一种方法是将依赖包直接构建到你的包中,而第二种方法则是在你的R代码中加入相应的行,测试data.table的存在(如果没有找到,甚至可以自动安装)。

data.table FAQ在6.9中明确指出,你可以通过以下方式确保你的包已经正确加载data.table:

要么i) 将data.table包包括在DESCRIPTION文件的Depends字段中,或者ii) 在DESCRIPTION文件的Imports字段中包括data.table并在NAMESPACE文件中导入(import)(data.table)。

正如评论中所述,这是许多R软件包中的常见行为。

另一种方法是创建特定的代码行,作为你代码的一部分,用于测试和导入所需的软件包。我认为,这不是理想的解决方案,因为使用上面提供的选项非常简洁。但是,从技术上讲,这是可行的。

一个简单的实现方法是使用requirelibrary检查是否存在data.table,如果不能附加,则会抛出错误。你甚至可以使用一组简单的条件语句来运行install.packages以安装所需的软件包,如果加载失败的话。

Yihui Xie (knitr作者)在这里有一个关于libraryrequire之间的差异的精彩文章,并且就那些绝对必须用到该软件包的情况,强烈建议只使用library


1
为什么要踩?或许可以评论一下如何改进答案? - TARehman
@MichaelChirico 一系列公正的建议。我已经努力扩展并链接了Arun和Soheil提到的一些项目。如果您有任何其他建议,我很乐意进一步修改。 - TARehman

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