2014-09-01 56 views
2

當在R終端運行下面​​的代碼:如何使用devtools在另一個軟件包內使用並行程序包?

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創建。)因此,不會與現有的可能具有破壞性的代碼進行交互。

回答

3

在寫這個問題的時候,我確實找到了答案,並且會在這裏分享它。

這裏的問題是包devtoolsparallel的組合。

顯然,出於某種原因,parallel要求包mypackage被安裝到一些當地的圖書館,即使你不需要將其加載到工人明確(例如使用clusterEvalQ(cl, library(mypackage))或類似的東西)!

我正在使用通常的devtools工作流程,這意味着我一直在dev_mode()工作。然而,這導致我的軟件包僅僅安裝在一些特殊的開發模式文件夾中(我不知道它是如何在內部工作的)。這些不會被調用parallel的工作進程搜索,因爲它們不在dev_mode中。

因此,這裏是我的 '處理方法':

## 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。

+0

男孩......我真的很喜歡它,如果devtools是固定的,這樣就不會發生,看到很多包現在使用並行包中的函數,很多人想要無縫地使用這些軟件包內,而無需執行此解決方法。 – 2014-10-02 06:40:09

相關問題