vapply()可以与可变长度的FUN.VALUE一起使用吗?

时间:2017-03-15 17:58:48

标签: r sapply

我正在尝试关注good practice并在函数内部使用vapply()代替sapply(),但是当需要固定长度时,发现vapply()的类型检查太不灵活了

假设我想要这样的东西:

list1 <- list(l1_one = 1:3, l1_two = letters[1:3])
list2 <- list(l2_one = 4:6, l2_two = letters[4:6], l2_three = 10:12)
list_12 <- list(list1, list2)

sapply(list_12, names)
# [[1]]
# [1] "l1_one" "l1_two"
# 
# [[2]]
# [1] "l2_one"   "l2_two"   "l2_three"

有没有办法允许变量长度,但检查返回的模式是“字符”,并且至少有一个长度?显然这不起作用:

vapply(list_12, names, character(2))
# Error in vapply(list_12, names, character(2)) : values must be length 2,
# but FUN(X[[2]]) result is length 3

1 个答案:

答案 0 :(得分:0)

sapply 是不安全的,因为它的返回类型不稳定。如果您知道返回类型,则可以安全地使用 vapply。如果没有,就像你的情况一样,只需使用 lapply 代替。

例如:

list1 <- list(l1_one = 1:3, l1_two = letters[1:3])
list2 <- list(l2_one = 4:6, l2_two = letters[4:6], l2_three = 10:12)
list_12 <- list(list1, list2)

lapply(list_12, names) # always list() return type