何时使用sapply和何时使用R';内部矢量化?
考虑以下代码:何时使用sapply和何时使用R';内部矢量化?,r,vectorization,R,Vectorization,考虑以下代码: strings<-c("string_x", "strxng_y", "xstring_z") replace_letters <- function(string){ gsub("x", "a", string) } replace_letters(strings) 而且: sapply(strings, replace_letters) 返回: [1] "string_a" "strang_y" "astring_z" string_x
strings<-c("string_x", "strxng_y", "xstring_z")
replace_letters <- function(string){
gsub("x", "a", string)
}
replace_letters(strings)
而且:
sapply(strings, replace_letters)
返回:
[1] "string_a" "strang_y" "astring_z"
string_x strxng_y xstring_z
"string_a" "strang_y" "astring_z"
这意味着不需要
sapply
和相关函数,因为R具有内部矢量化。然而,情况似乎并非如此。什么时候以及为什么R的内部矢量化不足,并且需要sapply
和相关函数?gsub
恰好在其第一个参数上进行了矢量化(strings
,在您的示例中),因此在这种情况下sapply
是不必要的。当然,sapply
有很多合法的用途,其中之一是当您需要将非矢量化函数应用于向量时。此外,如果您想将函数应用于数据帧的多个列,或者如果您想将函数应用于列表的每个元素,例如,gsub
的pattern
参数没有矢量化,因此如果要替换为不断变化的模式,则必须以某种方式进行循环。当所讨论的函数尚未矢量化时,它们是必需的。在这种情况下,我会选择vapply()
而不是sapply()
因为您知道结果总是一个长度为一个字符的向量