Из глубоко вложенного списка я хочу извлечь значения определенной ячейки. Некоторые из подсписков уже NA
находятся на более высоком уровне, так что цикл, который хочет извлечь значение более глубокого уровня, приведет к ошибке.
sapply(1:length(li), function(i) li[[i]][[1]]$b$l[2])
# Error: $ operator is invalid for atomic vectors
Я не уверен, какпропустите NA
s в такой структуре, например, это завершится неудачно с той же ошибкой:
sapply(1:length(li), function(i) na.omit(li[[i]][[1]]$b$l[2]))
Наконец, попытка try()
дает желаемый результат , но ошибка все еще находится врезультат, и я должен раздражать grep()
.
r <- sapply(1:length(li), function(i) try(li[[i]][[1]]$b$l[2], TRUE))
r[grep("Error", r)] <- NA
r
# [1] "2" "22" NA # <- desired result
Может ли это быть более элегантно решено в base R ? Я также хочу избежать клоунады с if
- else
с.
Мне нравится следующее, но я не представляю, как его использовать, чтобы опустить NA
с а-ля dat[!is.na(dat)]
:
rapply(li, function(x) !is.na(x), h="l")
Данные
li <- list(list(list(a=list(k=1:3, l=1:3), b=list(k=1:3, l=1:3))),
list(list(a=list(k=21:23, l=21:23), b=list(k=21:23, l=21:23))),
list(list(a=NA, b=NA)))