Можно ли использовать 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