使用粘贴列表

Pla*_*oul 1 r paste strsplit

我试图理解strsplit和的paste函数,它们是反函数.但是,当我strsplit是一个向量时,会返回一个列表,如下所示:

> strsplit(c("on,e","tw,o","thre,e","fou,r"),",")
[[1]]
[1] "on" "e" 

[[2]]
[1] "tw" "o" 

[[3]]
[1] "thre" "e"   

[[4]]
[1] "fou" "r"  
Run Code Online (Sandbox Code Playgroud)

我试着使用lapply,以cat列表的元素重新走到一起,但它不工作:

> lapply(strsplit(c("on,e","tw,o","thre,e","fou,r"),","),cat)
on etw othre efou r[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL
Run Code Online (Sandbox Code Playgroud)

相同的公式paste而不是cat实际上什么也没做!为什么我得到这些结果?我怎样才能得到我想要的结果,这又是原始的矢量?

(显然,在我的实际代码中,我试图用更多的东西来做strsplit,cat而不仅仅是返回原始向量,但我认为这个问题的解决方案对我来说很有效.谢谢!)

Ric*_*ven 6

虽然是的,cat将连接并打印到控制台,它实际上并没有以相同的方式运行paste.这个结果最好的解释help("cat")

中的collapse论证paste实际上与split论证中的论证相反strsplit.您可以使用sapply返回简化的粘贴矢量.

x <- c("on,e","tw,o","thre,e","fou,r")

( y <- sapply(strsplit(x, ","), paste, collapse = ",") )
# [1] "on,e"   "tw,o"   "thre,e" "fou,r" 
( z <- vapply(strsplit(x, ","), paste, character(1L), collapse = ",") )
# [1] "on,e"   "tw,o"   "thre,e" "fou,r"

identical(x, y)
# [1] TRUE
identical(x, z)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

请注意,对于这样的情况,vapply将比更有效sapply.并增加fixed = TRUEstrsplit应该提高效率为好.