parallel::clusterExport - 非导出 library/package 函数

parallel::clusterExport - non exported library/package function

类似于this question

但是我如何 clusterExport 一个包的非导出函数到一个集群?由于某种原因,这在提交给 CRAN 之前通过了 my tests,但在生产中不起作用。显然,我想修复并重新提交给 CRAN。

library(imputeMulti)
library(parallel)
imputeMulti:::count_compare # function to be exported

nnodes <- 2L
cl <- parallel::makeCluster(nnodes)    

parallel::clusterExport(cl, varlist= c("count_compare")) # fails -- but initially passed tests
parallel::clusterExport(cl, varlist= c("count_compare"), envir= as.environment("package:imputeMulti")) # also fails

我正在使用集群导出来避免 CRAN/R CMD 检查注释 "use of ::: in package"。显然,我可以导出 count_compare,但这不是一个理想的选择。

感谢任何帮助!

添加测试信息:

devtools::test("imputeMulti", "count_levels")
Loading imputeMulti
Testing imputeMulti
int- count_levels works: ...............................

DONE ===========================================================================================================================================

根据我的测试和工作,我没有看到在非导出库函数上使用 parallel::clusterExport

以下有效,但结果为 1 R CMD 检查注释:

R CMD check results
0 errors | 0 warnings | 1 note
checking dependencies in R code ... NOTE
There are ::: calls to the package's namespace in its code. A package almost never needs to use ::: for its own objects: 'count_compare'

count_compare <- imputeMulti:::count_compare 
parallel::clusterExport(cl, varlist= c("count_compare"), envir= 1)

也许 library(testthat) 的开发人员之一可以提供有关 testthat 框架未捕获此问题的解决方案/更新。基于 Hadley's R-Journal article(pg7 使用期刊编号),我猜这与环境用于测试的方式有关。但是,这只是一个猜测。

注意:Hadley 已通过电子邮件确认这是 testthat 未命中的原因。

您可以使用对 clusterCall 的等效调用来执行此操作。

parallel::clusterCall(cl, assign, "count_compare", count_compare, envir = .GlobalEnv)

查看 clusterExport 的定义以验证这是在做同样的事情。