为什么 sapply() 在字符上使用时会返回一个包含属性的列表?

MER*_*ose 4 r sapply

sapply()当用于字符向量时,会出现奇怪的行为:

y <- c("Hello", "bob", "daN")
z <- sapply(y, function(x) {toupper(x)})
z
# Hello     bob     daN 
# "HELLO"   "BOB"   "DAN" 
str(z)
# Named chr [1:3] "HELLO" "BOB" "DAN"
# - attr(*, "names")= chr [1:3] "Hello" "bob" "daN"
Run Code Online (Sandbox Code Playgroud)

为什么sapply()返回一个以旧值作为属性的向量?我不想要它们,我不需要它们,并且当应用于例如数值向量时我不知道这种行为。

Ric*_*ven 9

默认情况下,sapply()为字符向量上的每次迭代添加名称。USE.NAMES = FALSE通过在调用中使用,可以在没有名称的情况下传递结果。

sapply(y, toupper, USE.NAMES = FALSE)
# [1] "HELLO" "BOB"   "DAN" 
Run Code Online (Sandbox Code Playgroud)

这在中进行了解释help(sapply)

USE.NAMES - 逻辑;如果为 TRUE 并且 X 是字符,则使用 X 作为结果的名称,除非它已经有名称。由于该论证遵循...,因此其名称不能缩写。

请注意,当您仅应用单个函数时,无需使用匿名函数(匿名函数的使用效率也稍低)。上面也显示了这一点。

另请注意sapply()这里不需要,因为toupper()是矢量化的。

toupper(y)
# [1] "HELLO" "BOB"   "DAN"  
Run Code Online (Sandbox Code Playgroud)