我确信在使用以下代码时会得到字符向量:
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"