使用R6高效创建对象

问题描述

我想通过以下示例构造函数创建一组R6对象:

myClass <- R6Class("myClass",public = list(
                     height = NA,initialize = function() {
                       self$height <- rnorm(1,176,7)
                     })
)

并将它们放置在新的环境中:

myEnv <- new.env()

如果该小组有10位成员,我可以循环进行此操作:

 for(i in 1:10){  
  assign(paste0("group_member_",i),myClass$new(),envir = myEnv)
}

您可以想象这个规模会不断扩大,会有更多的小组成员,每个成员都有更多特征。

我相当确定这是执行此操作的一种不好方法或执行此操作的缓慢方法,或两者​​兼而有之!因此,我正在寻求与这两个方面有关的改进。

解决方法

您可以使用lapply在列表中一次性创建它们,然后将列表更改为环境:

myenv <- list2env(setNames(lapply(1:10,function(x) myClass$new()),paste0("group_member",1:10)))

ls(myenv)
#> [1] "group_member1"  "group_member10" "group_member2"  "group_member3"  
#> [5] "group_member4"  "group_member5"  "group_member6"  "group_member7"  
#> [9] "group_member8"  "group_member9" 
,

另一个选项是map

library(purrr)
library(dplyr)
library(stringr)
myenv <- list2env(map(1:10,~ myClass$new()) %>%  
            set_names(str_c('group_member',seq_along(.))))

-输出

ls(myenv)
#[1] "group_member1"  "group_member10" "group_member2"  "group_member3"  "group_member4"  "group_member5"  "group_member6" 
#[8] "group_member7"  "group_member8"  "group_member9"