如何在R6类中循环遍历子类

icomxhvb  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(101)

我是R6班的新手,我开始掌握窍门了。但是,我目前正在嵌套类,我想循环遍历特定嵌套类的列表。因此,如下面的示例所示,Person类的一些元素本身就是类,如BodyPart类,它通过Person类的armleghead元素合并。Person类还包含感兴趣的子类列表(bodyParts,作为对它们进行分组的一种方式)。Person类中的getVolume函数循环遍历列表并捕获感兴趣的特定子类。
一个简单而愚蠢的例子:

BodyPart <- R6::R6Class(classname = "BodyPart",
                        public = list(
                          width = numeric(),
                          volume = numeric(),
                          initialize = function(name = NA, width = 3, volume = 2){
                            self$name <- name
                            self$width <- width
                            self$volume <- volume
                          }
                          
                        )
)

Person <- R6::R6Class(classname = "Person",
                      public = list(
                        name = character(),
                        age = numeric(),
                        bodyParts = list(),
                        arm = environment(),
                        leg = environment(),
                        head = environment(),
                        initialize = function(name = NA, age = NA, bodyParts = list("arm", "leg", "head"), arm = NA, leg = NA, head = NA){
                          self$name <- name
                          self$age <- age
                          self$bodyParts <- bodyParts
                          self$arm <- arm
                          self$leg <- leg
                          self$head <- head
                        }, 
                        getVolume = function(){
                          for(bodyPart in self$bodyParts){
                            volume <- get(bodyPart)$volume
                            print(paste(bodyPart, volume))
                          }
                        }
                      )
)

LongArm <- BodyPart$new()
MediumLeg <- BodyPart$new()
CubeHead <- BodyPart$new()

Person <- Person$new(name = "Jake", age = 20, arm = LongArm, leg = MediumLeg, head = CubeHead)
Person$getVolume()

这段代码对一般的类(那些在Person类的**外部定义的类)有效,但对附加的子类无效,因为我不知道如何将self$部分合并到循环中。
我知道上面的例子有点愚蠢和间接,但想法是一样的。最终的计划是允许自定义数量的子类(使用...),这些子类可以通过bodyParts列表进行选择,允许函数同时与自定义数量的特定子类进行交互。
有人知道如何在R6类中选择特定的子类吗?或者,对于这个问题,另一种方法可能更有效?
非常感谢提前!

sxpgvts3

sxpgvts31#

我发现了一个非常简单的解决方法:将所有的bodyparts(子类)列在一起,并让类将列表作为属性/元素。然后循环遍历self$list以获得所需的任何值。
这就是

BodyPart <- R6::R6Class(classname = "BodyPart",
                        public = list(
                          width = numeric(),
                          volume = numeric(),
                          initialize = function(name = NA, width = 3, volume = 2){
                            self$name <- name
                            self$width <- width
                            self$volume <- volume
                          }
                          
                        )
)

Person <- R6::R6Class(classname = "Person",
                      public = list(
                        name = character(),
                        age = numeric(),
                        bodyParts = list(),
                        initialize = function(name = NA, age = NA, bodyParts = NA){
                          self$name <- name
                          self$age <- age
                          self$bodyParts <- bodyParts
                        }, 
                        getVolume = function(){
                          for(bodyPart in self$bodyParts){
                            print(bodyPart$volume)
                          }
                        }
                      )
)

LongArm <- BodyPart$new()
MediumLeg <- BodyPart$new()
CubeHead <- BodyPart$new()

bodyPartsList <- c(LongArm, MediumLeg, CubHead)

Person <- Person$new(name = "Jake", age = 20, BodyParts = bodyPartsList)
Person$getVolume()

希望这对其他人也有帮助!

相关问题