2016-01-14 7 views
10

मैं parLapply()R6 ऑब्जेक्ट के भीतर विंडोज़ पर parLapply() का उपयोग करना चाहता हूं और ध्यान दिया (कम से कम कुछ मामलों में) कि मुझे R6 फ़ंक्शन या डेटा को नोड्स में निर्यात करने की आवश्यकता नहीं है।आर 6 कक्षाओं के भीतर लंबवत

require(R6);require(parallel) 
square <- 
R6Class("square", 
     public = list(
      numbers = NA, 
      squares = NA, 
      initialize = function(numbers,integer) { 
       self$numbers <- numbers 
       squares <- private$square.numbers() 
      } 
     ), 
     private = list(
      square = function(x) { 
       return(x^2) 
      }, 
      square.numbers = function() { 
       cl <- makeCluster(detectCores()) 
       self$squares <- parLapply(cl, 
              self$numbers, 
              function (x) private$square(x) 
             ) 
       stopCluster(cl) 
      } 
     )) 
##Test 
test <- square$new(list(1,2,3)) 
print(test$squares) 
# [[1]] 
# [1] 1 
# 
# [[2]] 
# [1] 4 
# 
# [[3]] 
# [1] 9 

और एक दूसरे उदाहरण है, जहां मैं भी सार्वजनिक सदस्यों तक पहुँच सकते हैं:

square2 <- 
R6Class("square2", 
     public = list(
      numbers = NA, 
      squares = NA, 
      integer = NA, 
      initialize = function(numbers,integer) { 
       self$numbers <- numbers 
       self$integer <- integer 
       squares <- private$square.numbers() 
      } 
     ), 
     private = list(
      square = function(x) { 
       return(x^2) 
      }, 
      square.numbers = function() { 
       cl <- makeCluster(detectCores()) 
       self$squares <- parLapply(cl, 
              self$numbers, 
              function (x) private$square(x)+self$integer 
             ) 
       stopCluster(cl) 
      } 
     )) 
##Test 
test2 <- square2$new(list(1,2,3),2) 
print(test2$squares) 
#[[1]] 
#[1] 3 
# 
#[[2]] 
#[1] 6 
# 
#[[3]] 
#[1] 11 

मेरा प्रश्न दोहरा है:

एक उदाहरण है जहाँ मैं parLapply() के भीतर निजी तरीकों का उपयोग कर सकते है (1) आर 6 के बारे में क्या यह संभव बनाता है ताकि मुझे डेटा ऑब्जेक्ट्स और फ़ंक्शंस को निर्यात करने की आवश्यकता न हो; और (2) क्या मैं इस व्यवहार पर भरोसा कर सकता हूं या क्या यह इन विशिष्ट उदाहरणों का एक आर्टिफैक्ट है?

अद्यतन:

यह व्यवहार भी के बाद वस्तु instantiated कर दिया गया है जनता के तरीकों और सदस्यों का उपयोग कर काम करने के लिए प्रकट होता है:

square3 <- R6Class(
    classname = "square3", 
    public = list(
     numbers = NA, 
     squares = NA, 
     integer = NA, 
     square = function(x) { 
      return(x^2) 
     }, 
     square.numbers = function() { 
      cl <- makeCluster(detectCores()) 
      self$squares <- parLapply(cl, 
             self$numbers, 
            function (x) self$square(x)+self$integer 
           ) 
     stopCluster(cl) 
    }, 
    initialize = function(numbers,integer) { 
     self$numbers <- numbers 
     self$integer <- integer 
    } 
    ) 
) 
test3.obj <- square3$new(list(1,2,3),2) 
test3.obj$square.numbers() 
test3.obj$squares 

# [[1]] 
# [1] 3 
# 
# [[2]] 
# [1] 6 
# 
# [[3]] 
# [1] 11 

उत्तर

1
R6 वर्गों के साथ

, हर बार जब आप एक वस्तु का दृष्टांत, उस वस्तु एक संशोधित वातावरण के साथ, प्रत्येक समारोह/विधि की एक प्रति प्राप्त करता है। कार्यों को एक पर्यावरण असाइन किया जाता है जहां ऑब्जेक्ट के सार्वजनिक माहौल (0) ऑब्जेक्ट के सार्वजनिक वातावरण में self अंक (यह ऑब्जेक्ट का सार्वजनिक चेहरा है), और private अंक ऑब्जेक्ट के निजी वातावरण में इंगित करता है।

यह एस 3 विधियों से अलग है, जो किसी ऑब्जेक्ट के प्रत्येक तत्कालता के लिए कॉपी नहीं किया जाता है।

संक्षेप में: आर 6 के साथ, सब कुछ वस्तु में आत्मनिर्भर है; एस 3 के साथ, ऑब्जेक्ट में विधियां नहीं हैं।

मैं parLapply का उपयोग करने से परिचित नहीं हूं, लेकिन मुझे लगता है कि parLapply के साथ काम करने वाली चीज़ों पर भरोसा करना सुरक्षित है।

+0

धन्यवाद! यह एक बड़ी मदद है – chandler

+0

मैं इस स्पष्टीकरण से थोड़ी परेशान हूं: एस 3 के साथ भी काम नहीं करना चाहिए, क्योंकि आर के प्रत्येक फोर्क को कामकाजी सेट की अपनी प्रति प्राप्त होती है (ओएस कर्नेल इसे संभालता है, आर नहीं) ? किसी भी दर पर, मैं हमेशा इस तरह 'mclapply' का उपयोग कर रहा हूं (मैं' parlapply' या स्पष्ट क्लस्टर का उपयोग नहीं करता), मुझे कभी भी कुछ निर्यात नहीं करना पड़ा। –

+0

यह आपके ओएस एक्स/लिनक्स पर काम करने जैसा लगता है। मेरी (सीमित) समझ से, इन ऑपरेटिंग सिस्टम पर "कांटा" पूरी कामकाजी निर्देशिका प्राप्त करता है, जो विंडोज़ पर नहीं होता है। यही कारण है कि मैं इस व्यवहार के बारे में बहुत उत्सुक था क्योंकि हमें विंडोज उपयोगकर्ताओं को किसी भी तरीके या सदस्यों को निर्यात करने की आवश्यकता नहीं होगी (और इस प्रकार समानांतर कार्यान्वयन को और अधिक सुविधाजनक बनाना)। इसके अलावा, मैंने s3 के साथ बहुत कुछ नहीं किया है, इसलिए मैं इसी तरह की स्थिति में अपने व्यवहार पर टिप्पणी नहीं कर सकता – chandler

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