我正在尝试关注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
答案 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