2016-01-14 3 views
10

Я ищу, чтобы использовать 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 

ответ

1

С классов R6, каждый раз, когда вы создать экземпляр объекта, этот объект получает копию каждой функции/метода с измененной средой. Для функций назначается среда, в которой self указывает на общедоступную среду объекта (это открытый объект объекта), а private указывает на частную среду объекта.

Это отличается от методов S3, которые не копируются для каждого экземпляра объекта.

Подводя итог: с R6 все самодостаточно в объекте; с S3 объект не содержит методов.

Я не знаю, как использовать parLapply, но я думаю, что безопасно полагаться на такие вещи, как parLapply.

+0

спасибо! это большая помощь – chandler

+0

Я немного озадачен этим объяснением: не следует же работать с S3, просто потому, что каждая вилка R получает свою собственную копию рабочего набора (ядро ОС обрабатывает это, а не R) ? Во всяком случае, я всегда использовал 'mclapply', как это (я не использую' parLapply' или явные кластеры), мне никогда не приходилось экспортировать что-либо. –

+0

Похоже, вы работаете на os x/linux. По моему (ограниченному) пониманию, в этих операционных системах «вилка» получает весь рабочий каталог, чего не происходит в окнах. Вот почему мне было так интересно об этом поведении, так как пользователи Windows не будут экспортировать какие-либо методы или члены (и, таким образом, сделать параллельную реализацию намного удобнее). Кроме того, я не много работал с s3, поэтому я не могу прокомментировать его поведение в подобной ситуации – chandler

Смежные вопросы