gpt4 book ai didi

R - 自定义类列表的 'unlist' 方法

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

我有一些自定义类,例如:

setClass("foo", slots = c(mat = "matrix"))

我想处理 foo 对象列表如何“未列出”。
mat <- matrix(rnorm(16), 4)
foo <- new("foo", mat = mat)
unlist(list(foo))

我想也许为 c 创建方法(我认为它被使用但可能不正确)并且 unlist 可以解决问题。

S3版本
#' @export
unlist <- function(x, ...) UseMethod("unlist", x)

#' @export
unlist.default <- base::unlist
#' @method unlist foo
#' @export
unlist.foo <- function(x, ...){
print("called foo unlist")
}

S4版
#' @export
setMethod("unlist",
signature = "foo",
function(x, recursive = TRUE, use.names = TRUE){
print("call foo unlist")
})
c 函数
#' @export
setMethod("c",
signature = "foo",
function(x, ..., recursive = FALSE){
print("called foo c")
})

但是当我直接使用 c 时,我只看到确认消息:
c(foo)
[1] "called foo c"
unlist 只返回相同的对象,没有打印消息
unlist(list(foo))
[[1]]
An object of class "foo"
Slot "mat":
[,1] [,2] [,3] [,4]
[1,] 0.6711541 -0.2783441 -0.4707375 -0.23060105
[2,] 0.7408401 0.4076826 2.2757187 -0.48547413
[3,] 1.8640581 0.3610619 -0.4632473 -0.06498348
[4,] -0.5595930 0.6679157 -0.8142456 0.27499963

如果我调用 unlist(foo),那么我会收到打印消息,但我需要将其应用于 foo 对象列表。关于如何让 unlist 处理列表中的自定义类的任何想法?

最终,我希望以下内容返回 TRUE :
all.equal(unlist(list(foo)), unlist(list(mat)))

最佳答案

恐怕这是不可能的。 unlist根据获得的列表中各个元素的类型确定其输出的类型。如果所有元素都是原子的,比如唯一的元素是 foo (一个矩阵),它对其参数做了一些事情——将参数强制为公共(public)原子向量(只有一个)并忘记了它的大部分属性(例如维度)。但是,它不会将恰好基于原子向量的 S4 对象(如 foo )视为原子向量:因此这些 S4 对象将在结果中保持不变,结果将是列表类型。所以调用unlistlist(foo)返回 list(foo) .该行为在 C 中实现( do_unlistbind.c 中),在我看来与文档一致。

unlist 的可能用法子集中模仿所需行为,可以为 foo 的列表实现一个新类对象,定义 list对于 foo ,然后定义一个新的unlist这个 list-of-foo 类的行为类似于 unlist 的默认 C 实现在原子向量列表上的行为(我没有尝试过)。

关于R - 自定义类列表的 'unlist' 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40116585/

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