gpt4 book ai didi

r - 是否有等效于 unlist() 的 S4?

转载 作者:行者123 更新时间:2023-12-04 01:06:00 25 4
gpt4 key购买 nike

我有一些使用 S4 的经验对象及其插槽,所以我知道如何访问特定的插槽和子插槽。我想学习的是如何以 unlist 的方式“去槽化”对象拆开 S3列表。
我的直接目标是让我的一个玩具有一个 S4 对应物,它返回一个对象的元素数:

lssize<-function(items){
if (any(sapply(sapply(items,get),typeof)=='closure')){
warning('Closures in list, will ignore.')
items<-items[(sapply(sapply(bar,get),typeof)=='closure')!=TRUE]
}
sizes<-sapply(sapply(sapply(sapply(items,get,simplify=F), unlist,simplify=F), as.vector,simplify=F), length)
return(sizes)
}

(不公平地 mock 我的代码:-))。我希望不必编写一些递归例程,一次提取一个插槽来转换它们。

编辑:我知道 object.size将返回字节数;不是我在这里追求的。

最佳答案

(使用 slotNameslot 而不是依赖于 attributes ,这被修改为更接近先前删除的答案)。我们可以编写一个函数来测试一个实例是否是 S4 对象,如果是,则将所有插槽提取为列表并递归

f = function(x) {
if (isS4(x)) {
nms <- slotNames(x)
names(nms) <- nms
lapply(lapply(nms, slot, object=x), f)
} else x
}

进而
A = setClass("A", representation(x="numeric"))
B = setClass("B", representation(a="A", b="numeric"))
f(B())

得出一个简单的旧列表,我们可以将其用于我们想要的任何目的。
$a
$a$x
numeric(0)

$a$class
[1] "A"
attr(,"package")
[1] ".GlobalEnv"


$b
numeric(0)

$class
[1] "B"
attr(,"package")
[1] ".GlobalEnv"
f可能需要增强,例如,通过 setOldClass 处理 NULL 值或由 S3 类制成的 S4 类。 .代码到 validObject将是我寻找更全面遍历的地方的选择。

概括可能会使访问者沿着以下路线
visitLeavesWith <-
function(object, FUN, ...)
{
f = function(x) {
if (isS4(x)) {
slots <- setNames(slotNames(x), slotNames(x))
lapply(lapply(slots, slot, object=x), f)
} else FUN(x, ...)
}
f(object)
}

例如。,
visitLeavesWith(B(), length)

关于r - 是否有等效于 unlist() 的 S4?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14803237/

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