gpt4 book ai didi

r - 如何以规范的方式将 as.list 扩展到 S4 对象

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

我在将我的 S4 对象转换回列表时遇到了一些问题。例如,以下嵌套的 S4 类:

setClass("nssItem", 
representation(value = "numeric", text = "character", prefix = "character", type = "character"),
prototype(value = as.numeric(NA), text = as.character(NA), prefix = as.character(NA), type = as.character(NA))

)

setClass("geckoNss", representation(absolute = "character", item = "nssItem"))

geckoNss 类的对象包含nssItem 类的对象。从概念上讲,这似乎是一个允许嵌套的类似列表的结构。

然而,

> temp <- new("nssItem")
> as.list(temp)
Error in as.list.default(temp) :
no method for coercing this S4 class to a vector

我理解这个错误,也就是说,我还没有真正定义 as.list 的含义或它如何应用于 nssItem 类。尽管如此,这似乎是一个非常自然的操作。我如何将 as.list 的定义扩展到我定义的所有新类?

最佳答案

这是第二种更通用的解决方案。它使用一个父类(super class),您可以从中派生所有用户定义的类。说明在 # 注释中。

#this is an "empty" superclass that characterises all user-defined classes
setClass("user_defined_class")

#we create an as.list method for this new superclass (this time an S4 method)
setMethod("as.list",signature(x="user_defined_class"),function(x) {
mapply(function(y) {
#apply as.list if the slot is again an user-defined object
#therefore, as.list gets applied recursively
if (inherits(slot(x,y),"user_defined_class")) {
as.list(slot(x,y))
} else {
#otherwise just return the slot
slot(x,y)
}
},
slotNames(class(x)),
SIMPLIFY=FALSE)
})

setClass("nssItem",
representation(value = "numeric",
text = "character",
prefix = "character",
type = "character"),
prototype(value = as.numeric(NA),
text = as.character(NA),
prefix = as.character(NA),
type = as.character(NA)),
#note the contains argument that flags the nssItem class as user-defined
contains="user_defined_class")

setClass("geckoNss",
representation(absolute = "character", item = "nssItem"),
#the same for the geckoNss class
contains="user_defined_class")

现在为每个类创建一个对象

temp <- new("nssItem")
tempGecko<-new("geckoNss")

强制 temp 列出

as.list(temp)
#$value
#[1] NA
#
#$text
#[1] NA
#
#$prefix
#[1] NA
#
#$type
#[1] NA

还有 tempGecko 对象

as.list(tempGecko)
#$absolute
#character(0)
#
#$item
#$item$value
#[1] NA
#
#$item$text
#[1] NA
#
#$item$prefix
#[1] NA
#
#$item$type
#[1] NA

关于r - 如何以规范的方式将 as.list 扩展到 S4 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30386009/

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