2012-05-24 18 views
5

मुझे आर में समांतर पैकेज के साथ काम करने के लिए कुछ कोड प्राप्त करने में समस्या आ रही है। मैं आर 2.15 का उपयोग कर रहा हूं।आर समांतर एस 4 वर्ग क्लस्टर त्रुटि

यहाँ एक सरल उदाहरण है ... मैं एक फ़ाइल 'animal.R' जो निम्नलिखित शामिल है:

# animal.R 
setClass("Animal", representation(species = "character", legs = "numeric")) 

##Define some Animal methods 
setGeneric("count",function(x) standardGeneric("count")) 
setMethod("count", "Animal", function(x) { [email protected]}) 

setGeneric("countAfterChopping",function(x) standardGeneric("countAfterChopping")) 
setMethod("countAfterChopping", "Animal", function(x) { [email protected] <- [email protected]; [email protected]}) 

फिर, मेरी आर टर्मिनल में, मैं चलाएँ:

library(parallel) 
source('animal.R') 

प्रारंभ दो नोड्स के एक स्थानीय क्लस्टर:

cl <- makeCluster(rep('localhost', 2)) 

बताएँ पशु वर्ग के बारे में क्लस्टर नोड्स:

# This works 
parSapply(cl, list(daisy, fred), count) 

# This doesn't... 
parSapply(cl, list(daisy, fred), countAfterChopping) 

बंद करो क्लस्टर:

clusterEvalQ(cl, parse('animal.R')) 

तब क्लस्टर पर कुछ कोड को चलाने

stopCluster(cl) 

parSapply करने के लिए पहली कॉल की उम्मीद काम करता है के रूप में है, लेकिन दूसरा यह त्रुटि पैदा करता है:

Error in checkForRemoteErrors(val) : 
    2 nodes produced errors; first error: "Animal" is not a defined class 

कोई विचार क्या चल रहा है? समान रूप से काम करने के लिए दूसरी कॉल क्यों नहीं है?

+0

जब आप 'animal.R parse', आप एक unevaluated अभिव्यक्ति मिलता है, तो आप या तो इस्तेमाल कर सकते हैं' clusterEvalQ (सीएल, eval (पार्स ('animal.R '))) या सिर्फ स्क्रिप्ट स्रोत। क्या यह चाल है? – BenBarnes

+0

आह, हाँ ... ऐसा लगता है कि चाल चल रही है। बहुत बहुत धन्यवाद! – Ash

उत्तर

3

तो यहाँ क्या हो रहा है है:

वर्ग "पशु" के एस 4 वस्तुओं के लिए, count समारोह बस legs स्लॉट निकालता है। यदि यह सब कुछ आप कर रहे थे, तो आपको अपने क्लस्टर नोड्स पर फ़ाइल animal.R का मूल्यांकन या स्रोत करने की आवश्यकता नहीं होगी। सभी आवश्यक जानकारी parSapply द्वारा पारित की जाएगी।

हालांकि, countAfterChopping फ़ंक्शन legs स्लॉट पर एक नया मान निर्दिष्ट करता है, और यह वह जगह है जहां मजा शुरू होता है। स्लॉट असाइनमेंट फ़ंक्शन `@<-` में पर check = TRUE तर्क के साथ एक कॉल शामिल है। यह फ़ंक्शन checkSlotAssignment का मूल्यांकन ट्रिगर करता है, जो "कक्षा की परिभाषा से परामर्श करके, इस स्लॉट के लिए प्रदान किए गए मान की अनुमति है" (?checkSlotAssignment से)।

इसलिए, कक्षा परिभाषा को इस तरह से एक स्लॉट को आवंटित करते समय जाना जाना चाहिए, और एस 4 वर्ग "पशु" क्लस्टर नोड्स पर ज्ञात नहीं है। यही कारण है कि पार्स की गई फ़ाइल animal.R का मूल्यांकन करना या इसे सोर्सिंग करना। हालांकि, आप फ़ाइल की पहली पंक्ति का मूल्यांकन करने के साथ ठीक होंगे, यानी, प्रत्येक नोड पर कक्षा "पशु" को परिभाषित करना।

यहाँ एक कम है, प्रतिलिपि प्रस्तुत करने योग्य उदाहरण है:

animal.R<-" 
    setClass('Animal', representation(species = 'character', legs = 'numeric')) 

    ##Define some Animal methods 
    setGeneric('count',function(x) standardGeneric('count')) 
    setMethod('count', signature(x='Animal'), function(x) { [email protected]}) 

    setGeneric('countAfterChopping',function(x) standardGeneric('countAfterChopping')) 
    setMethod('countAfterChopping', signature(x='Animal'), 
    function(x) { [email protected] <- [email protected]; [email protected]}) 
" 
library(parallel) 

source(textConnection(animal.R)) 

cl <- makeCluster(rep('localhost', 2)) 

daisy<-new("Animal",legs=2,species="H.sapiens") 
fred<-new("Animal",legs=4,species="C.lupus") 

parSapply(cl, list(daisy, fred), count) 
# [1] 2 4 

clusterExport(cl,"animal.R") # 
clusterEvalQ(cl,eval(parse(textConnection(animal.R),n=1))) 

parSapply(cl, list(daisy, fred), countAfterChopping) 
# [1] 1 3 
+0

हां, यह समझ में आता है, आपकी मदद के लिए बहुत बहुत धन्यवाद! – Ash

संबंधित मुद्दे