当使用names()函数时,为什么*apply返回命名对象而不是值的向量

  • 本文关键字:对象 返回 apply 向量 names 函数 r
  • 更新时间 :
  • 英文 :


我确信在使用以下代码时会得到字符向量:

vec <- c(a = 1, b = 2)
vec
#> a b 
#> 1 2
sapply(vec, names)
#> $a
#> NULL
#> 
#> $b
#> NULL

但它返回的命名对象(在本例中为list(具有NULL值,而不是像我认为的那样由names()函数返回的值。为什么?

名称不会传递给函数,只传递给值。如果要使用名称,请使用名称(vec(。如果您想同时访问名称和值,请使用其中一个:

# pass names and values
f <- function(name, value)  sprintf("%s: %d", name, value)
mapply(f, names(vec), vec)
##      a      b 
## "a: 1" "b: 2" 
# pass names but look up values
f2 <- function(name) sprintf("%s: %d", name, vec[name])
sapply(names(vec), f2)
##      a      b 
## "a: 1" "b: 2" 
# pass index and lookup both names and values
f3 <- function(i) sprintf("%s: %d", names(vec)[i], vec[i])
sapply(seq_along(vec), f3)
##      a      b 
## "a: 1" "b: 2" 
# if values are unique can pass values and look up names
f4 <- function(value) sprintf("%s: %d", names(vec)[match(value, vec)], value)
sapply(vec, f4)
##      a      b 
## "a: 1" "b: 2" 
# convert to a 2 column data frame w names (ind) and values  
spl <- split(stack(vec), seq_along(vec))  
sapply(spl, with, sprintf("%s: %d", ind, values))
##      a      b 
## "a: 1" "b: 2" 

最新更新