假设我有一个清单
lst <- list(c("A1", "A1", "A1", "A1", "A1", "A1"),
c("", "R1", "R2", "R2", "R2", "R2"),
c("", "", "", "U1", "U2", "U3"))
输出在哪里
[[1]]
[1] "A1" "A1" "A1" "A1" "A1" "A1"
[[2]]
[1] "" "R1" "R2" "R2" "R2" "R2"
[[3]]
[1] "" "" "" "U1" "U2" "U3"
现在,我想有一个 vector ,其元素组合成这样
out <- paste0(lst[[1]], lst[[2]], lst[[3]])
输出将在哪里
[1] "A1" "A1R1" "A1R2" "A1R2U1" "A1R2U2" "A1R2U3"
如何才能更动态地执行此操作(例如,较长或较短的列表)?我试图使用
sapply
等,但无济于事。 最佳答案
你可以做到这一点
do.call("paste0", lst)
# [1] "A1" "A1R1" "A1R2" "A1R2U1" "A1R2U2" "A1R2U3"
这会将
lst
的所有列作为参数传递给paste0
,因此基本上就像paste0(list[[1]], list[[2]], list[[3]])
但是不管
lst
中有多少个 vector 在基数R中,
do.call()
与Python具有的“splat”类型运算符一样近。 rlang
包使用bang-bang-bang运算符引入了另一种选择。但是您必须构建表达式并对其进行显式求值。library(rlang)
eval_tidy(expr(paste0(!!!lst)))
# [1] "A1" "A1R1" "A1R2" "A1R2U1" "A1R2U2" "A1R2U3"