首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >parLapply在R6类中

parLapply在R6类中
EN

Stack Overflow用户
提问于 2016-01-14 08:38:29
回答 1查看 583关注 0票数 11

我希望在parLapply()对象内的窗口上使用R6,并注意到(至少在某些情况下)我不需要将R6函数或数据导出到节点。

下面是一个可以在parLapply()中访问私有方法的示例

代码语言:javascript
复制
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

还有第二个例子,我也可以访问公共成员:

代码语言:javascript
复制
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)我能依赖这种行为吗?或者这是这些特定示例的产物?

更新:

在实例化对象之后,此行为似乎还可以使用公共方法和成员工作:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-28 16:41:15

使用R6类,每次实例化对象时,该对象都会获得每个函数/方法的副本,并使用修改后的环境。函数被分配给一个环境,其中self指向对象的公共环境(这是对象的公共面),private指向对象的私有环境。

这与S3方法不同,后者不对对象的每个实例化进行复制。

总之:对于R6,所有东西都是自包含在对象中;对于S3,对象不包含方法。

我不太熟悉parLapply的使用,但我认为依赖于使用parLapply这样的东西是安全的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34784932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档