【发布时间】:2018-11-02 12:03:29
【问题描述】:
所有这些看起来非常相似的功能之间有什么区别?
【问题讨论】:
所有这些看起来非常相似的功能之间有什么区别?
【问题讨论】:
stri_join、stri_c 和 stri_paste 来自包 stringi 并且是纯别名
str_c 来自 stringr 并且只是带有参数 ignore_null 的 stringi::stri_join 硬编码为 TRUE 而 stringi::stri_join 将其设置为 FALSE默认。 stringr::str_join 是 str_c 的已弃用别名
见:
library(stringi)
identical(stri_join, stri_c)
# [1] TRUE
identical(stri_join, stri_paste)
# [1] TRUE
library(stringr)
str_c
# function (..., sep = "", collapse = NULL)
# {
# stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE)
# }
# <environment: namespace:stringr>
stri_join 与base::paste 非常相似,但有一些区别如下:
1. sep = "" 默认
因此默认情况下它的行为更像paste0,但paste0 丢失了它的sep 参数。
identical(paste0("a","b") , stri_join("a","b"))
# [1] TRUE
identical(paste("a","b") , stri_join("a","b",sep=" "))
# [1] TRUE
identical(paste("a","b", sep="-"), stri_join("a","b", sep="-"))
# [1] TRUE
str_c 的行为与此处的 stri_join 相同。
2。 NA的行为
如果使用stri_join粘贴到NA,结果为NA,而paste将NA转换为"NA"
paste0(c("a","b"),c("c",NA))
# [1] "ac" "bNA"
stri_join(c("a","b"),c("c",NA))
# [1] "ac" NA
str_c 在此处的行为也与 stri_join 一样
3.长度为0 参数的行为
当遇到长度为 0 的值时,会返回 character(0),除非将 ignore_null 设置为 FALSE,否则会忽略该值。它不同于 paste 的行为,后者会将长度 0 值转换为 "",因此在输出中包含 2 个连续的分隔符。
stri_join("a",NULL, "b")
# [1] character(0)
stri_join("a",character(0), "b")
# [1] character(0)
paste0("a",NULL, "b")
# [1] "ab"
stri_join("a",NULL, "b", ignore_null = TRUE)
# [1] "ab"
str_c("a",NULL, "b")
# [1] "ab"
paste("a",NULL, "b") # produces double space!
# [1] "a b"
stri_join("a",NULL, "b", ignore_null = TRUE, sep = " ")
# [1] "a b"
str_c("a",NULL, "b", sep = " ")
# [1] "a b"
4. stri_join 警告更多
paste(c("a","b"),c("c","d","e"))
# [1] "a c" "b d" "a e"
paste("a","b", sep = c(" ","-"))
# [1] "a b"
stri_join(c("a","b"),c("c","d","e"), sep = " ")
# [1] "a c" "b d" "a e"
# Warning message:
# In stri_join(c("a", "b"), c("c", "d", "e"), sep = " ") :
# longer object length is not a multiple of shorter object length
stri_join("a","b", sep = c(" ","-"))
# [1] "a b"
# Warning message:
# In stri_join("a", "b", sep = c(" ", "-")) :
# argument `sep` should be one character string; taking the first one
5. stri_join 更快
microbenchmark::microbenchmark(
stringi = stri_join(rep("a",1000000),rep("b",1000),"c",sep=" "),
base = paste(rep("a",1000000),rep("b",1000),"c")
)
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# stringi 88.54199 93.4477 97.31161 95.17157 96.8879 131.9737 100 a
# base 166.01024 169.7189 178.31065 171.30910 176.3055 215.5982 100 b
【讨论】: