使用 R6 高效创建对象

Efficient object creation with 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"