我正在构建一个 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
导入如此多的函数,完全破坏了我正在处理的包中维护良好的命名空间。
注意,这个包包含一个项目, future 许多其他分析师将致力于该项目。虽然简单地编写 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.
关于r - 如何在包中使用 data.table 而不导入所有函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69544896/