在R终端中运行以下代码时:
library(parallel)
func <- function(a,b,c) a+b+c
testfun <- function() {
cl <- makeCluster(detectCores(), outfile="parlog.txt")
res <- clusterMap(cl, func, 1:10, 11:20, MoreArgs = list(c=1))
print(res)
stopCluster(cl)
}
testfun()
......它运作得很好。但是,当我将两个函数定义复制到我自己的包中时,添加一行#' @import parallel
,在R终端上执行dev_tools::load_all("mypackage")
,然后调用testfun()
,我得到一个
Error in unserialize(node$con) (from myfile.r#7) :
error reading from connection
其中#7是包含对clusterMap
的调用的行。
所以完全相同的代码在终端上运行,但不在包内。
如果我查看parlog.txt
,我会看到以下内容:
starting worker pid=7204 on localhost:11725 at 13:17:50.784
starting worker pid=4416 on localhost:11725 at 13:17:51.820
starting worker pid=10540 on localhost:11725 at 13:17:52.836
starting worker pid=9028 on localhost:11725 at 13:17:53.849
Error: (converted from warning) namespace 'mypackage' is not available and has been replaced
by .GlobalEnv when processing object ''
Error: (converted from warning) namespace 'mypackage' is not available and has been replaced
by .GlobalEnv when processing object ''
Error: (converted from warning) namespace 'mypackage' is not available and has been replaced
by .GlobalEnv when processing object ''
Error: (converted from warning) namespace 'mypackage' is not available and has been replaced
by .GlobalEnv when processing object ''
问题的根源是什么?如何解决?
请注意,我是用一个完全新鲜的裸包来做这件事的。 (由devtools::create
创建。)因此,不与现有的,可能具有破坏性的代码进行交互。
答案 0 :(得分:3)
在撰写问题时,我实际上找到了答案,并将在此处分享。
此处的问题是包devtools
和parallel
的组合。
显然,出于某种原因,parallel
要求将包mypackage
安装到某个本地库中,即使您不需要明确地将其加载到工作程序中 (例如使用clusterEvalQ(cl, library(mypackage))
或类似的东西)!
我正在使用通常的devtools
工作流程,这意味着我一直在dev_mode()
工作。但是,这导致我的软件包只安装在一些特殊的开发模式文件夹中(我不知道它在内部是如何工作的)。调用的工作进程parallel
不会搜索这些内容,因为它们不在dev_mode中。
所以这是我的&#39;解决方法&#39;:
## turn off dev mode
dev_mode()
## install the package into a 'real' library
install("mypackage")
library(mypackage)
## ... and now the following works:
mypackage:::testfun()
正确Hadley just pointed out,另一种解决方法是添加一行
clusterEvalQ(cl, dev_mode())
群集创建后立即。这样,可以使用dev_mode。