gpt4 book ai didi

r - 为什么 lapply 不适用于具有 as.list.default 方法的 S4 对象?

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

假设我有一个类似向量的 S4 类:

.MyClass <- setClass("MyClass", representation(a="numeric", b="character"))

setMethod("[", c("MyClass", "numeric", "missing"), function(x, i, j, ...) {
do.call(initialize, c(x, sapply(slotNames(x), function(y) slot(x, y)[i],
simplify=FALSE)))
})

setMethod("length", "MyClass", function(x) length(x@a))

并且说我还为 as.list 定义了方法和 as.list.default :
setGeneric("as.list")
setMethod("as.list", "MyClass",
function(x) lapply(seq_along(x), function(i) x[i]))
setGeneric("as.list.default")
setMethod("as.list.default", "MyClass",
function(x) lapply(seq_along(x), function(i) x[i]))

现在给定这个类的一个对象, myobj :
myobj <- .MyClass(a=1:4, b=letters[1:4])

当我使用 lapply ,它提示:
> lapply(myobj, function(i) rep(i@b, i@a))
Error in as.list.default(X) :
no method for coercing this S4 class to a vector

但是如果我使用 as.list.default ,该函数给出了所需的输出:
> lapply(as.list.default(myobj), function(i) rep(i@b, i@a))
[[1]]
[1] "a"

[[2]]
[1] "b" "b"
...

为什么 lapply即使我为 as.list.default 定义了一个方法也不起作用为了类(class)?

显然我可以手动定义一个 lapply类的方法,它会正常工作(见下文),但我想知道实际上在哪里遇到错误。为什么是 lapply试图将我的对象强制转换为向量,即使它调用的函数应该将对象转换为列表?
setGeneric("lapply")
setMethod("lapply", c("MyClass", "function"), function(X, FUN, ...) {
lapply(as.list(X), FUN, ...)
})
lapply(myobj, function(i) rep(i@b, i@a))

最佳答案

来自 ?Methods帮助页面,一个可行的策略似乎是

#same
.MyClass <- setClass("MyClass", representation(a="numeric", b="character"))

setMethod("[", c("MyClass", "numeric", "missing"), function(x, i, j, ...) {
do.call(initialize, c(x, sapply(slotNames(x), function(y) slot(x, y)[i],
simplify=FALSE)))
})

setMethod("length", "MyClass", function(x) length(x@a))

#different
as.list.MyClass <-function(x) {
lapply(seq_along(x), function(i) x[i])
}
setMethod("as.list", "MyClass", as.list.MyClass)

#test
myobj <- .MyClass(a=1:4, b=letters[1:4])
lapply(myobj, function(i) rep(i@b, i@a))

# [[1]]
# [1] "a"
#
# [[2]]
# [1] "b" "b"
#
# [[3]]
# [1] "c" "c" "c"
#
# [[4]]
# [1] "d" "d" "d" "d"

关于r - 为什么 lapply 不适用于具有 as.list.default 方法的 S4 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26079819/

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