使用 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"
我想从以下示例构造函数创建一组 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"