我试图理解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而不仅仅是返回原始向量,但我认为这个问题的解决方案对我来说很有效.谢谢!)
虽然是的,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 = TRUE在strsplit应该提高效率为好.