首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用R6高效创建对象

利用R6高效创建对象
EN

Stack Overflow用户
提问于 2020-10-15 15:30:28
回答 2查看 80关注 0票数 3

我想从下面的示例构造函数中创建一组R6对象:

代码语言:javascript
复制
myClass <- R6Class("myClass",
                   public = list(
                     height = NA,
                     initialize = function() {
                       self$height <- rnorm(1, 176, 7)
                     })
)

并将他们置于一个新的环境中:

代码语言:javascript
复制
myEnv <- new.env()

如果这个小组有10个成员,我可以用一个循环来完成:

代码语言:javascript
复制
 for(i in 1:10){  
  assign(paste0("group_member_", i), 
         myClass$new(),
         envir = myEnv)
}

你可以想象这被放大了,有更多的组成员,每个成员都有更多的特征。

我敢肯定,这不是一种糟糕的方法,就是一种缓慢的方法,或者两者兼而有之!因此,我正在寻找与这两个方面相关的改进。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-15 15:48:14

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

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

Stack Overflow用户

发布于 2020-10-15 16:38:51

另一个选择是map

代码语言:javascript
复制
library(purrr)
library(dplyr)
library(stringr)
myenv <- list2env(map(1:10, ~ myClass$new()) %>%  
            set_names(str_c('group_member', seq_along(.))))

-output

代码语言:javascript
复制
ls(myenv)
#[1] "group_member1"  "group_member10" "group_member2"  "group_member3"  "group_member4"  "group_member5"  "group_member6" 
#[8] "group_member7"  "group_member8"  "group_member9" 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64374954

复制
相关文章

相似问题

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