2016-10-28 37 views
1

我不明白如何將全局定義的類傳遞給使用並行程序包生成的集羣。我有工作了一個功能:R全局並行編程定義S4類

funs = "testClass" 
fun = function(x) testClass(test = x^2) 
testClass = function(test) return(test) 

cl <- parallel::makeCluster(2, outfile='') 
parallel::clusterExport(cl = cl, varlist = funs, envir = globalenv()) 
res <- parallel::parLapply(cl = cl, X = seq_len(10L), fun = fun) 
parallel::stopCluster(cl) 
res 

同樣的方法不適合一類工作:

funs = "testClass" 
fun = function(x) testClass(test = x^2) 
testClass = setClass("testClass", slots = c(test = "numeric")) 

cl <- parallel::makeCluster(2, outfile='') 
parallel::clusterExport(cl = cl, varlist = funs, envir = globalenv()) 
res <- parallel::parLapply(cl = cl, X = seq_len(10L), fun = fun) 
parallel::stopCluster(cl) 

我知道這是可能把類和發電機功能的包裝,但有這個問題更簡單的解決方案?

+0

您的代碼不起作用。什麼是「樂趣」和「樂趣」? –

+0

對於兩個代碼塊來說,樂趣和樂趣是相同的。更新爲清晰。 –

回答

1

定義S4類實際上會修改全局環境中的一些隱藏的元數據對象。僅僅將發電機功能複製到從節點是不夠的;你必須在每個節點上執行類定義語句。 (嗯,你可以複製這些元數據對象了,但是這只是自找麻煩。)

cl <- parallel::makeCluster(2, outfile='') 
parallel::clusterEvalQ(cl, expr={ 
    testClass <- setClass("testClass", slots = c(test = "numeric")) 
}) 
res <- parallel::parLapply(cl = cl, X = seq_len(10L), fun = fun) 

res 

# [[1]] 
# An object of class "testClass" 
# Slot "test": 
# [1] 1 
# 
# [[2]] 
# An object of class "testClass" 
# Slot "test": 
# [1] 4 
# . . . 
+0

感謝您提供此信息。它解決了我上面給出的小例子。它也有助於解決我所面臨的更復雜的問題。我最終使用了parallel :: clusterCall,因爲它允許你傳入變量。 –