मैं 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
धन्यवाद! यह एक बड़ी मदद है – chandler
मैं इस स्पष्टीकरण से थोड़ी परेशान हूं: एस 3 के साथ भी काम नहीं करना चाहिए, क्योंकि आर के प्रत्येक फोर्क को कामकाजी सेट की अपनी प्रति प्राप्त होती है (ओएस कर्नेल इसे संभालता है, आर नहीं) ? किसी भी दर पर, मैं हमेशा इस तरह 'mclapply' का उपयोग कर रहा हूं (मैं' parlapply' या स्पष्ट क्लस्टर का उपयोग नहीं करता), मुझे कभी भी कुछ निर्यात नहीं करना पड़ा। –
यह आपके ओएस एक्स/लिनक्स पर काम करने जैसा लगता है। मेरी (सीमित) समझ से, इन ऑपरेटिंग सिस्टम पर "कांटा" पूरी कामकाजी निर्देशिका प्राप्त करता है, जो विंडोज़ पर नहीं होता है। यही कारण है कि मैं इस व्यवहार के बारे में बहुत उत्सुक था क्योंकि हमें विंडोज उपयोगकर्ताओं को किसी भी तरीके या सदस्यों को निर्यात करने की आवश्यकता नहीं होगी (और इस प्रकार समानांतर कार्यान्वयन को और अधिक सुविधाजनक बनाना)। इसके अलावा, मैंने s3 के साथ बहुत कुछ नहीं किया है, इसलिए मैं इसी तरह की स्थिति में अपने व्यवहार पर टिप्पणी नहीं कर सकता – chandler