gpt4 book ai didi

r - S4 类不可子集

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

我正在尝试为 S4 类编写子集方法。我收到 this S4 class is not subsettable无论我尝试过什么,都会出错。

这是一个最小的例子:

setClass(Class = "A", representation = representation(ID = "character"))
setClass(Class = "B", representation = representation(IDnos = "list"))

a1 <- new(Class = "A", ID = "id1")
a2 <- new(Class = "A", ID = "id2")

B1 <- new(Class = "B", IDnos = c(a1, a2))

当我输入:
B1@IDnos[[1]]

我得到了我想要的:

> An object of class "A"
> Slot "ID":
> [1] "id1"


但我想通过写这样的东西来得到这个: B1[1]或者如果不是通过 B1[[1]]
来自 THIS发布后,我有了一些想法并试图模仿作者写的内容。但它在我的情况下不起作用:
setMethod("[", c("B", "integer", "missing", "ANY"),
function(x, i, j, ..., drop=TRUE)
{
x@IDnos[[i]]
# initialize(x, IDnos=x@IDnos[[i]]) # This did not work either
})
B1[1]

> Error in B1[1] : object of type 'S4' is not subsettable

以下代码也不起作用:
setMethod("[[", c("B", "integer", "missing"),
function(x, i, j, ...)
{
x@IDnos[[i]]
})
B1[[1]]

> Error in B1[[1]] : this S4 class is not subsettable

有任何想法吗?

最佳答案

我认为你的问题是你的签名太严格了。您需要一个“整数”类。默认情况下

class(1)
# [1] "numeric"

所以它实际上不是一个真正的“整数”data.type。但是当你确实指定了一个整数文字时
class(1L)
# [1] "integer"

B1[1L]
# An object of class "A"
# Slot "ID":
# [1] "id1"

所以最好使用更通用的签名
setMethod("[", c("B", "numeric", "missing", "ANY"), ... )

这将允许您最初的尝试工作
B1[2]
# An object of class "A"
# Slot "ID":
# [1] "id2"

关于r - S4 类不可子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25458721/

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