我正在尝试理解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"
我尝试将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
使用paste
代替cat
的相同公式实际上什么都不做!为什么我得到这些结果?我怎样才能得到我想要的结果,这又是原始的向量?
(显然,在我的实际代码中,我尝试使用strsplit
和cat
做更多事情,而不仅仅是返回原始向量,但我认为解决此问题的方法对我来说很有用。谢谢!)
答案 0 :(得分: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
请注意,对于此类情况,vapply
将比sapply
更有效。在fixed = TRUE
中添加strsplit
也可以提高效率。