如何在不导入所有函数的情况下在包中使用 data.table?

How can I use data.table in a package without importing all functions?

我正在构建一个 R 包,我想在其中使用 dtplyr 来执行各种数据操作。我的问题是 dtplyr 似乎只有在我导入整个 data.table 时才有效(即使用 roxygen #' @import data.table)。没有这个我会得到这样的错误:

Error in .(x = sum(x), y = sum(y),  : 
  could not find function "." 

如果我只从data.table导入某些功能就可以解决这个问题,那就太好了,但是包中似乎没有功能.()。我对 data.table 的了解有限,但我只能假设它使用 .() 来编辑已解析的代码(类似于基础 R bquote()),但由于某种原因 dtplyr需要 data.table 加载才能工作。

我尝试了各种方法,例如 withr::with_package("data.table", code)requireNamespace("data.table"),但到目前为止,导入整个包似乎是唯一可行的方法。这不是一个可行的解决方案,因为它通过从 data.table.

导入如此多的函数,完全破坏了我正在处理的包中维护良好的命名空间

注意,此包包含一个项目,许多其他分析师将在未来很长一段时间内开展该项目。虽然就性能和一般良好实践而言,简单地编写 data.table 代码可能更可取,但使用 dtplyr 翻译 dplyr 代码可以大大提高可读性和易用性在这种情况下更重要。

我找到的(已记录的)解决方案是在包源代码中的某处设置 .datatable.aware <- TRUE。根据 documentation,如果你在一个包中使用 data.table 而没有导入整个东西,你应该这样做,这样 [.data.table() 就不会恢复调用 [.data.frame()。来自文档:

...please define .datatable.aware = TRUE anywhere in your R source code (no need to export). This tells data.table that you as a package developer have designed your code to intentionally rely on data.table functionality even though it may not be obvious from inspecting your NAMESPACE file.