R: Именованные списки и списки описаний - PullRequest
4 голосов
/ 26 января 2020

R имеет два класса, которые не так часто используются: "Dlist" и "namedList".

Что касается первого, он упоминается относительно Sys.getenv(), который возвращает результат класса "Dlist" если его аргумент отсутствует, для хорошей печати. На самом деле для класса есть метод print.Dlist. Существует также явно связанная функция formatDL для форматирования списков описания. Однако я не знаю, как создать объект класса "Dlist".

Что касается «namedList», оно определяется руководством:

альтернатива «списку», в котором сохраняется атрибут names

В этом case Я не могу создать объект этого типа и не нашел ни одного экземпляра, где он используется.

Как создать «Dlist» или «namedList»?
Можете ли вы предоставить пример, где "namedList" удобнее обычного именованного списка ? (предполагается как список L, где names(L) не NULL)

1 Ответ

3 голосов
/ 26 января 2020

A Dlist - это неформальный класс, определенный в базовом пакете R, который существует с единственной целью красивой печати именованного вектора символов. Это вообще не список, а тип вектора символов:

a <- Sys.getenv()
class(a)
# [1] "Dlist"
typeof(a)
# [1] "character"

Вы можете создать его, просто написав Dlist в атрибуте класса именованного вектора символов:

hello_world <- c(Hello = "World", Hi = "Earth", Greetings = "planet"); 
class(hello_world) <- "Dlist"

hello_world
# Hello                    World
# Hi                       Earth
# Greetings                planet

Вы можете выбрать параметры форматирования с помощью formatDL:

cat(formatDL(hello_world, style = "list", width = 20), sep = "\n")
# Hello: World
# Hi: Earth
# Greetings: planet

Dlist используется только в базе R для печати переменных среды на консоль. Если вы не хотите, чтобы именованный символьный вектор печатался таким образом, вам не нужен Dlist.


С другой стороны, namedList - это формальный объект S4, как определено в пакете methods (также предварительно загружен в R). Он наследует свои атрибуты от list и определяет один метод - свою собственную версию generi c S4 show. Вы можете использовать его как базовый класс, из которого можно создавать новые классы S4, которые наследуют свойства именованного списка (то есть обычного списка с атрибутом names), хотя не ясно, почему пользователь достаточно продвинулся, чтобы создавать классы S4. не делайте этого сами. Здесь определено .

Вы можете создать namedList с помощью new:

n <- new("namedList", list(a=1, b=2))
n
# An object of class  “namedList” 
# $`a`
# [1] 1
# 
# $b
# [1] 2
isS4(n)
# [1] TRUE
...