Можно ли использовать vapply() с FUN.VALUE переменной длины?

Я стараюсь следовать хорошей практике и использовать 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 ответ

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
Другие вопросы по тегам