Efficient object creation with R6

137 Views Asked by At

I want to create a group of R6 objects from the following example constructor:

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

And place them in a new environment:

myEnv <- new.env()

If the group has 10 members, I can do this with a loop:

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

You can imagine this is scaled up, with many more group members, each with many more characteristics.

I'm fairly sure this is either a bad way to do this or a slow way to do this, or both! Therefore, I'm looking for improvements related to both aspects.

2

There are 2 best solutions below

0
On BEST ANSWER

You could create them in one go in a list using lapply, then change the list to an environment:

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" 
0
On

Another option is map

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

-output

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