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

Posted

技术标签:

【中文标题】如何在不导入所有函数的情况下在包中使用 data.table?【英文标题】:How can I use data.table in a package without importing all functions? 【发布时间】:2021-12-01 07:22:57 【问题描述】:

我正在构建一个 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 代码可以提高可读性和易用性,这在这种情况下更为重要。

【问题讨论】:

你能在 NAMESPACE 中试试importFrom data.table 这会导致运行devtools::load_all()时出错:Error in asChar(ivars) : empty name in directive 'importFrom' in 'NAMESPACE' file :( 我认为 importFrom 在两个地方,即 NAMESPACE 和函数中应该可以工作 importFrom data.table . 你能查一下here 您可能需要导入[ 以及.,也许是patterns(不确定dtplyr 使用什么)。如果维护良好的命名空间非常重要(我认为您的用户不会知道或关心),您总是可以exclude 函数,您不想让它混乱。为此,请使用 #' @rawNamespace import(data.table, except=c(transpose)) 之类的内容。 【参考方案1】:

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

...请在您的 R 源代码中的任何位置定义 .datatable.aware = TRUE(无需导出)。这告诉 data.table,您作为包开发人员已将您的代码设计为有意依赖 data.table 功能,即使通过检查您的 NAMESPACE 文件可能并不明显。

【讨论】:

以上是关于如何在不导入所有函数的情况下在包中使用 data.table?的主要内容,如果未能解决你的问题,请参考以下文章

我如何在包中读取函数和过程 body/ddl?

如何在包中只导入没有 exec __init__.py 的子模块

如何在不重复代码的情况下在所有控制器中显示警报?

如何在不使用存储过程的情况下在表函数中返回值 exec?

如何在不使用窗口函数的情况下在大查询中选择 max(date)?

如何在不复制/粘贴的情况下在我的所有活动中使用这些元素?