我想以列表的形式检索R6Class对象的所有属性的值。这些值最好与属性名称一起提供。理想情况下,这可以一般地编写,以便它也适用于继承的类。不幸的是,R6的文档并不那么全面,我找不到一个类似的问题。
下面的基本示例将演示我目前拥有的以及目标解决方案应该是什么样子。
Person <- R6::R6Class("Person", public = list(
age = NULL,
gender = NULL,
initialize = function(age, gender = "M") {
self$age <- age
self$gender <- gender
},
list_attributes = function(){
return(list(self$age, self$gender))
}
))
p <- Person$new(age=42, gender="W")
p$list_attributes()
# Output
> [[1]]
> [1] 42
> [[2]]
> [1] "W"
list_attributes
部分地实现了我想要的功能,但我认为应该有一种更好的方法来获取所有公共属性,而不是显式地命名所有公共属性。我发现使用str(p)
我可以得到一些关于我的对象的信息,但不是以我想要的形式。
> str(p)
Classes 'Person', 'R6' <Person>
Public:
age: 42
clone: function (deep = FALSE)
gender: W
initialize: function (age, gender = "M")
list_attributes: function ()
我想要的outut会喜欢:
list(age=42, gender="M")
$age
[1] 42
$gender
[1] "M"
有没有人知道如何实现这一点?
3条答案
按热度按时间ibrsph3r1#
谢谢你的提问和回答,我也在为同样的问题而挣扎。
这个问题链接到我最近提出的一个问题,关于在对象here中更改self的类。
正如向我解释的那样,可以使用
class(self)
访问对象中的对象类,因此不需要使用私有的“class”字段,因此您的问题可以使用your对象结构来解决:其给出:
或,将所有内容放在一个
active
字段中,并使用set_names()
:其给出:
n3schb8v2#
R6::Class
打印函数的source code帮助我更接近我想要的解决方案。现在函数产生了想要的输出,但是我必须指定我现在已经做的类作为私有成员变量。如果这可以动态地完成,我会很高兴。
现在的输出是:
vulvrdjw3#
在上面的答案中,提取字段与类耦合。我更喜欢使用一个函数来提取字段和字段值。因此,我可以使用它与任何R6类。
sapply(r6class, class)
执行此工作(提取所有插槽及其类。剩下的就是提取值,如果插槽不是环境或函数的话。然后