gpt4 book ai didi

r - 使用 R6,如何查找从某个父类(super class)继承的类和对象?

转载 作者:行者123 更新时间:2023-12-01 18:59:21 25 4
gpt4 key购买 nike

假设我有:

Foo <- R6::R6Class("Foo")
Bar1 <- R6::R6Class("Bar1", inherit = "Foo")
Bar2 <- R6::R6Class("Bar2", inherit = "Foo")

f <- Foo$new()

A.我可以做类似的事情

R6::findChildren("Foo")
[1] "Bar1" "Bar2"

(我认为这与 R, R6, Get Full Class Name from R6Generator Object 相同,但包括它是为了更全面)

B.我可以做类似的事情

R6::findInstances("Foo")
[1] "f"

C.我可以做类似的事情

b1 <- Bar1$new()
b2 <- Bar2$new()
R6::findInstances("Foo")
[1] "f" "b1" "b2"

最佳答案

我不知道 R6 中是否有内置函数可以完成这些任务。

但是,有一种方法可以通过使用具有引用语义的成员来自己编写类似的功能。原因是引用成员将在该类的所有实例之间共享,如here所述。

If your R6 class contains any fields that also have reference semantics (e.g., other R6 objects, and environments), those fields should be populated in the initialize method. If the field set to the reference object directly in the class definition, that object will be shared across all instances of the R6 objects.

下面我只讨论B.和C.,因为A.已经被回答了here (如问题中提到的)。

基本设置

您必须“直接在类定义中”添加具有引用语义的成员,并在创建新实例时更改该成员。

library(R6)

foo <- R6Class(
public = list(
info = new.env(), # member with reference semantics
initialize = function(ID){
self$info$IDs = c(self$info$IDs, ID) # "push_back" new ID
}
)
)

a_name <- foo$new("a_id")
b_name <- foo$new("b_id")

a_name$info$IDs
# [1] "a_id" "b_id"
b_name$info$IDs
# [1] "a_id" "b_id"

请注意,此代码将为您提供实例ID,而不是实例名称

继承

通过从父类(也称为 super 类)调用 ID 管理器来继承此行为非常简单。

bar <- R6Class(
inherit = foo,
public = list(
initialize = function(ID){
super$initialize(ID) # use ID management from the super class
}
)
)

c_name <- bar$new("c_id")
c_name$info$IDs
# [1] "a_id" "b_id" "c_id"

列表ID现在将包含foobar实例的所有ID。

一个漂亮的包装

如果您想从 foo 对象而不是其实例获取 ID,可以使用以下内容

# add a new "static" function to the R6Class/environment foo
foo$getIDs <- function(){
dummy_instance <- foo$new(NULL) # inserting NULL in an unnamed list does nothing
dummy_instance$info$IDs
}

foo$getIDs()
# [1] "a_id" "b_id" "c_id"

我知道这不是您所要求的,因为该方法将为您提供 ID 而不是名称,但对于某些目的来说,这可能就足够了。

关于r - 使用 R6,如何查找从某个父类(super class)继承的类和对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44961211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com