У меня есть вектор списков, и я использую unlist
на них. Некоторые элементы в векторах NULL
и unlist
кажется, отбрасывает их.
Как я могу предотвратить это?
Вот является простое (не) рабочим примером, показывающим эту нежелательную функцию unlist
a = c(list("p1"=2, "p2"=5),
list("p1"=3, "p2"=4),
list("p1"=NULL, "p2"=NULL),
list("p1"=4, "p2"=5))
unlist(a)
p1 p2 p1 p2 p1 p2
2 5 3 4 4 5
Проблема в том, что вы не можете иметь NULL
в середине вектора. Например:
> c(1,NULL,3)
[1] 1 3
Вы можете иметь NA посередине. Вы можете преобразовать его в символьный, а затем обратно в числовой, который автоматически преобразует значения NULL в NA (с предупреждением):
> b <- as.numeric(as.character(a))
Warning message:
NAs introduced by coercion
затем введите имена обратно, потому что они были отброшены предыдущей операцией:
> names(b) <- names(a)
> b
p1 p2 p1 p2 p1 p2 p1 p2
2 5 3 4 NA NA 4 5 `
В этом случае (одноуровневый список глубины) это тоже должно работать:
a[sapply(a, is.null)] <- NA
unlist(a)
# p1 p2 p1 p2 p1 p2 p1 p2
# 2 5 3 4 NA NA 4 5
Правильный способ указать отсутствующее значение - NA (not NULL). Вот другая версия, которая работает:
a = c(list("p1"=2, "p2"=5),
list("p1"=3, "p2"=4),
list("p1"=NA, "p2"=NA),
list("p1"=4, "p2"=5))
unlist(a)
p1 p2 p1 p2 p1 p2 p1 p2
2 5 3 4 NA NA 4 5