Я хотел бы преобразовать именованный список символов, например
stringlist = list("list1" = list("a","b",c("a","b")),
"list2" = list("c","d",c("c","d")))
в вектор символов
[1] "a" "b" "ab" "c" "d" "cd"
где объекты списка длины > 1 объединяются в один элемент результирующего вектора символов. Решение из этой темы есть
sapply(stringlist, paste0, collapse = "")
который возвращает
list1 list2
"abc(\"a\", \"b\")" "cdc(\"c\", \"d\")"
поэтому мне было интересно, есть ли элегантное и короткое решение этой проблемы.
Так как у вас есть вложенный список unlist
это один уровень, а затем используйте решение, которое у вас есть.
unname(sapply(unlist(stringlist, recursive = FALSE), paste0, collapse = ''))
#[1] "a" "b" "ab" "c" "d" "cd"
Использование rapply
.
unname(rapply(stringlist, paste, collapse = ""))
# [1] "a" "b" "ab" "c" "d" "cd"
Вариант с rrapply
library(rrapply)
unname(rrapply(stringlist, f = paste, collapse = "", how = 'unlist'))
#[1] "a" "b" "ab" "c" "d" "cd"
Другой базовый вариант R использует вложенный sapply
(но не такой простой, как метод r(r)apply
)
> c(sapply(stringlist, function(x) sapply(x, paste0, collapse = "")))
[1] "a" "b" "ab" "c" "d" "cd"
В противном случае используйте аргумент
use.names
вunlist
напрямую вместо добавления функцииunname
, т.е.sapply(unlist(stringlist, recursive = F, use.names = F), paste0, collapse = "")