Головоломка заключается в доступе к элементам списка в «псевдо-слоте» объекта.
Это успешно с использованием 2 из 4 подходов, которые можно попробовать:
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"
А вот имен в псевдослоте нет.
[email protected]
## [[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
Таким образом, когда псевдо-слот является именованным списком, попытка просмотра или использования этих имен успешна только для 2 из 4 очевидных подходов и ноль из 4 после создания подкласса. Обойти проблему не проблема; это довольно легко. (Хотя я хотел бы знать, как написать средство доступа для объекта TempB, используя имена.) Я просто хочу понять.