Я ищу, чтобы использовать parLapply()
на окнах в объекте R6
и заметил (что, по крайней мере, в некоторых случаях), что мне не нужно экспортировать функции или данные R6 в узлы.parLapply в пределах классов R6
Вот пример, где я могу получить доступ к частным методам в parLapply()
:
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
Мой вопрос имеет два аспекта: (1) Что относительно R6 делает это возможным, так что мне не нужно экспортировать объекты и функции данных; и (2) могу ли я полагаться на это поведение или это артефакт этих конкретных примеров?
UPDATE:
Такое поведение также, кажется, работает с использованием общих методов и членов после того, как объект был создан экземпляр:
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
Я немного озадачен этим объяснением: не следует же работать с S3, просто потому, что каждая вилка R получает свою собственную копию рабочего набора (ядро ОС обрабатывает это, а не R) ? Во всяком случае, я всегда использовал 'mclapply', как это (я не использую' parLapply' или явные кластеры), мне никогда не приходилось экспортировать что-либо. –
Похоже, вы работаете на os x/linux. По моему (ограниченному) пониманию, в этих операционных системах «вилка» получает весь рабочий каталог, чего не происходит в окнах. Вот почему мне было так интересно об этом поведении, так как пользователи Windows не будут экспортировать какие-либо методы или члены (и, таким образом, сделать параллельную реализацию намного удобнее). Кроме того, я не много работал с s3, поэтому я не могу прокомментировать его поведение в подобной ситуации – chandler