【问题标题】:How to use data.table::setDTthreads() in my own package?如何在我自己的包中使用 data.table::setDTthreads()?
【发布时间】:2021-09-09 12:55:27
【问题描述】:

我是第一次开发非常小的软件包(而且 - 也许这对我的问题很重要 - 想在 CRAN 上发布它)。这个包使用 data.table 和 base R 中的函数。我想利用 data.table::setDTthreads() 函数提供的并行计算。

当用户加载 data.table 包时,此函数会立即调用,但我在开发包时没有这样做。我现在所做的只是:(1)在DESCRIPTION文件中,我将data.table添加到Imports字段; (2) 在 NAMESPACE 中,我包含了 import(data.table)。

据我所知,这与 library(data.table) 不同,我不希望这样,因为我不想在用户加载我的包时加载 data.table。但我仍然想使用 data.table::setDTthreads() 函数。我应该在我的脚本中哪里包含它?或者也许我正在使用它,因为我在 NAMESPACE 中包含了 import(data.table)?

我的包在 R/ 目录中只包含一个 .R 文件,功能很少,但只有一个会被导出以对用户可见(所以其他的只是辅助函数)。比方说,它看起来像这样:

#' roxygen2 skeleton
main_function <- function(x) {
 x <- helper_function_1(x)
 x
}

helper_function_1 <- function(x) {
 x
}

我真正担心的是,当我在我的包中使用 data.table::setDTthreads() 时,它会对用户的环境产生影响,即我将启用并行计算并设置线程,而不仅仅是我的函数包,但通常用于用户会话。

【问题讨论】:

    标签: r data.table r-package


    【解决方案1】:

    非常好的问题。 是的,它会影响用户环境中的所有 data.table 调用(包括来自其他包的调用),而不仅仅是来自您的包的调用。 一般的建议是不要在你的包中设置这个值,但让用户知道他们可以自己设置它。如果你想在你的包中设置它,你应该很好地记录它。 请注意,50% 与 100% 的差异通常非常小(可能小于 5%,甚至在共享环境中变慢)所以我建议您衡量如果收益很小,是否真的值得弄乱用户环境. 例如检查这些时间 https://github.com/h2oai/db-benchmark/issues/202

    您还可以填写功能请求,以便为来自单个包的调用设置线程数。通过检查调用的顶级环境在技术上是可行的。

    【讨论】:

    • 谢谢。我会选择让用户知道这种可能性。
    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 2019-12-06
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多