如何在不导入所有函数的情况下在包中使用 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.
我正在构建一个 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.