在软件包开发中使用data.table包的`[`方法

5
我们正在创建一个包,其中一个函数使用了data.table包的函数。我们尽可能在代码中使用::,而非在roxygen头文件中导入整个包。
对于一个函数来说,这很容易。例如:
data.table::setkey(our_data_1, our_variable)

然而,我们不知道如何针对一种方法进行此操作。例如:

our_data_3 <- our_data_1[our_data_2, roll = "nearest"]

在data.table中,[是具有特定方法的,这表明:

methods(`[`)

我尝试了多种方法,多种组合,使用@importFrom,但都失败了。例如,将以下行添加到我们的roxygen头文件中...

@importFrom data.table `[.data.table`

在运行devtools::document()时返回了以下内容:
Warning message:
object ‘[.data.table’ is not exported by 'namespace:data.table' 

我也尝试过在代码中使用[.data.table等方式,但这些方法都失败了...

在我们的roxygen头部导入整个data.table包是可行的(@import data.table),但不推荐这样做,因为我们想要在代码中引用每个函数的包(或者至少使用@importFrom)。

有没有一种方法可以在函数代码中使用data.table的[方法,而不必导入整个data.table包呢?或者至少可以通过在roxygen头部使用@importFrom来只导入该方法吗?

非常感谢!

2个回答

5

无需导入S3方法,它们会自动根据对象的类进行分派。

在使用[ data.table方法时,有一个技巧可以确保将data.table传递给期望data.frame的库时,能够正确处理为data.frame。此处理是基于NAMESPACE文件决定的。如果您不在NAMESPACE中导入data.table,则data.table方法会假定您想将其用作data.frame。

您可以通过在任何一个R脚本文件中使用额外的变量.datatable.aware=TRUE来明确说明您的意图。

您应该阅读导入data.table文档,其中已经很好地描述了这一点。

如果因某种原因您的代码仍然无法正常工作,我还放置了一个示例包,您可以从那里运行和调试:https://gitlab.com/jangorecki/useDTmethod


1
谢谢,这帮了我很多!一开始我遇到了困难,因为我在函数体内添加了.datatable.aware=TRUE,但并没有解决我的问题。通过尝试你提供的可行示例,我注意到你将其放在了函数体外面。把它移到那里就解决了!感谢你花时间帮助我并提供可行的示例。 - Jonas B.

1
我认为你不需要像在函数中那样导入S3方法或使用::
在我看来,你只需要在DESCRIPTION中添加data.table作为依赖项,就可以正常工作。
R会知道你正在对一个data.table对象应用[,并且会使用正确的方法。

感谢您的回复!data.table在DESCRIPTION文件的Imports:部分中列出,但这并没有解决问题。使用import(data.table)在NAMESPACE中导入data.table可以解决问题(也许是因为像您提到的那样,R现在正确地识别了data.table对象)。然而,由于我们详细使用lubridate函数并完全导入此库,因此由于data.tablelubridate之间具有类似命名的函数而导致一些警告。因此,我们希望省略在NAMESPACE中导入data.table - Jonas B.

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