为什么sapply()在字符上使用时返回带有属性的列表?

时间:2015-08-07 00:03:25

标签: 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"

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

1 个答案:

答案 0 :(得分:4)

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

sapply(y, toupper, USE.NAMES = FALSE)
# [1] "HELLO" "BOB"   "DAN" 

help(sapply)

中对此进行了解释
  

USE.NAMES - 逻辑;如果为TRUE且X是字符,则使用X作为结果的名称,除非它已经有名称。由于这个论点如下......它的名字不能缩写。

注意,当您仅应用单个函数时,不需要使用匿名函数(匿名函数使用效率稍差)。这也显示在上面。

另请注意此处不需要sapply(),因为toupper()已经过矢量化。

toupper(y)
# [1] "HELLO" "BOB"   "DAN"