【发布时间】:2014-05-21 15:48:12
【问题描述】:
谜题是访问对象“伪槽”中的列表元素。
使用可能尝试的 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 种方法中则为零。解决问题不是问题;这很容易。 (虽然我想知道如何使用名称为 TempB 对象编写访问器。)我只是想了解。
【问题讨论】: