如何在我自己的包中使用 data.table::setDTthreads()?
How to use data.table::setDTthreads() in my own package?
我是第一次开发非常小的包(并且 - 也许这对我的问题很重要 - 想在 CRAN 上发布)。这个包使用来自 data.table 和基础 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() 时,它会对用户环境产生影响,即我将启用并行计算并设置线程,而不仅仅是为了我的功能在我的包中,但通常用于用户的会话。
很好的问题。
是的,它会影响用户环境中的所有 data.table 调用(包括来自其他包的调用),而不仅仅是来自您的包的调用。
一般建议不要在您的包中设置此值,但要让用户知道他们可以自己设置。如果你想在你的包中设置它,你应该很好地记录它。
请注意,50% 与 100% 通常是非常小的差异(可以小于 5%,甚至在共享环境中变慢)所以我建议您衡量如果好处很小,是否真的值得扰乱用户环境.
例如检查这些时间
https://github.com/h2oai/db-benchmark/issues/202
您还可以填写一个功能请求,以便为来自单个程序包的调用设置线程数。通过检查调用的顶级环境在技术上是可能的。
我是第一次开发非常小的包(并且 - 也许这对我的问题很重要 - 想在 CRAN 上发布)。这个包使用来自 data.table 和基础 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() 时,它会对用户环境产生影响,即我将启用并行计算并设置线程,而不仅仅是为了我的功能在我的包中,但通常用于用户的会话。
很好的问题。 是的,它会影响用户环境中的所有 data.table 调用(包括来自其他包的调用),而不仅仅是来自您的包的调用。 一般建议不要在您的包中设置此值,但要让用户知道他们可以自己设置。如果你想在你的包中设置它,你应该很好地记录它。 请注意,50% 与 100% 通常是非常小的差异(可以小于 5%,甚至在共享环境中变慢)所以我建议您衡量如果好处很小,是否真的值得扰乱用户环境. 例如检查这些时间 https://github.com/h2oai/db-benchmark/issues/202
您还可以填写一个功能请求,以便为来自单个程序包的调用设置线程数。通过检查调用的顶级环境在技术上是可能的。