r - 子类化包含名称为 : access by name 的列表的 S4 类

标签 r s4 slot

难题在于访问对象“伪插槽”中列表的元素。

使用 4 种方法中的 2 种可能会成功:

setClass("TempA", contains="list")
A = new("TempA", list(a=1,b=2))
A   

只打印 A 不显示列表名称。

## An object of class "TempA"
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 2

不过,您可以按名称提取元素。

A[["b"]]  
## [1] 2

然后 names() 提取名称。

names(A) 
## [1] "a" "b"

但是伪插槽中没有名称。

A@.Data  
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 2

如果不在伪插槽本身中,名称隐藏在哪里?

情节变厚了。我的目标是子类化(添加一些插槽;此处未显示)。 但是,如果我们进行子类化,即使是上面两种成功的方法现在也会失败。列表的名称显然不存在。

setClass("TempB", contains="TempA")
B = new("TempB", list(a=1,b=2))
names(B) ## no names.
## NULL
B[["b"]] ## NULL
## NULL

这是一种不同的方法。这行吗?不。

B2 = new("TempB", new("TempA", list(a=1,b=2)))
B2[["a"]]  # NULL
## NULL
names(B2) # NULL
## NULL
names(as(B2, "TempA"))  ## still no dice
## NULL

总而言之,当伪插槽是一个命名列表时,尝试查看或使用这些名称对于 4 种明显方法中只有 2 种是成功的,而在子类化之后的 4 种方法中只有 0 种是成功的。解决问题不是问题;这很容易。 (虽然我想知道如何使用名称为 TempB 对象编写访问器。)我只是想了解。

最佳答案

S4 将槽作为属性实现,而 R 将列表元素的名称作为属性存储在列表中。因此在 ?Classes 中提到了冲突。 “解决方案”是创建一个带有“名称”插槽的类

A = setClass("A", representation("list", names="character"))

但这也需要对名称进行显式管理,例如,

setMethod("[", c("A", "ANY", "missing", "missing"),
    function(x, i, j, ..., drop=TRUE)
{
    initialize(x, x@.Data[i], names=names(x)[i], ...)
})

导致

> a = A(list(a=1, b=2))
> a[2:1]
An object of class "A"
[[1]]
[1] 2

[[2]]
[1] 1

Slot "names":
[1] "b" "a"

但也明显不完整

> a[20]
An object of class "A"
[[1]]
NULL

Slot "names":
[1] NA

关于r - 子类化包含名称为 : access by name 的列表的 S4 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23788082/

相关文章:

r - 从 Matrix 包中导入 S4 函数

r - S4方法调度慢吗?

javascript - 从 Vue 中的槽更新父级中的状态

c++ - Qt C++信号转Qml

r - 如何访问原子向量属性?

将 SPSS 文件读入 R 抛出错误 - 读取系统文件头时出错

R:计算列中值的分数,按另一列中的值分组

xml - 使用 XML 数据的 R 中的“externalptr”错误

r - R 中的继承

c++ - 没有这样的插槽/信号(Qt)