Векторизация в R в основном означает, что любой цикл перемещается на более быстрый, скомпилированный язык, такой как C или FORTRAN. Для этого рассматриваемый вектор (ы) должен быть «атомарным», то есть он должен быть «плоским» и однородным, а тип вектора, который можно проверить с помощью typeof()
, должен иметь смысл для операции (й)выполняетсяЕсли он атомарный, то он векторизован.
Вы можете проверить, является ли вектор атомарным, используя is.atomic()
. Другой тип вектора, который не векторизован, называется «рекурсивным», который можно проверить с помощью is.recursive()
. Рекурсивные объекты могут содержать другие объекты любого типа, то есть они могут быть неоднородными. Списки и фреймы данных являются рекурсивными.
Попробуйте что-то вроде следующего, чтобы получить представление об атомном и рекурсивном:
# Atomic:
1
1:3
c("a", "b", "c")
c(T, F, T)
# Recursive:
list(nums = 1:3, letts = c("a", "b", "c"), logics = c(T, F, T))
data.frame(nums = 1:3, letts = c("a", "b", "c"), logics = c(T, F, T))
# Vectors can be atomic or recursive:
is.vector(1:9) # TRUE
is.atomic(1:9) # TRUE
is.recursive(1:9) # FALSE
is.vector(list(nums = 1:9, chars = "x")) # TRUE
is.atomic(list(1:9)) # FALSE
is.recursive(list(1:9)) # TRUE
# Matrices are atomic, data frames are recursive:
is.vector(matrix(1:9, 3)) # FALSE
is.atomic(matrix(1:9, 3)) # TRUE
is.recursive(matrix(1:9, 3)) # FALSE
is.vector(as.data.frame(matrix(1:9, 3))) # FALSE
is.atomic(as.data.frame(matrix(1:9, 3))) # FALSE
is.recursive(as.data.frame(matrix(1:9, 3))) # TRUE
Я думаю, вы можете предположить, что многие, если не большинство,функции R, которые вы используете чаще всего, векторизованы. Я не думаю, что есть какой-либо способ проверить это кроме просмотра документации или внутренних функций. Всякий раз, когда вы думаете о написании цикла for для простых элементарных операций, подумайте о том, как сделать это с помощью векторизации. При достаточной практике это станет для вас второй натурой. Для более подробной информации я могу порекомендовать это сообщение в блоге от Ноама Росса.