Как я узнаю, что функция или операция в R векторизована? - PullRequest
7 голосов
/ 26 октября 2019

Я все еще учусь R. Есть ли какой-нибудь автоматизированный способ определить, является ли R operation или function vectorized? Чтобы определить, является ли R объект vector, я могу использовать is.vector(x), который возвращает TRUE, если x является вектором или False в противном случае. Есть ли что-то подобное для vectorized?

Например:

x <- c(1,2,3)
y <- c(3,4,5)
x+y
#[1] 4 6 8

Так как + векторизован, он автоматически adds отдельных элементов вектора x с отдельными элементами y. В противном случае мне пришлось бы использовать цикл for для получения аналогичного результата.

for(i in seq_along(x)){
  cat(sprintf("%i ", x[i]+y[i]))
}
#4 6 8 

Мое пока ограниченное понимание термина Vectorized влечет за собой автоматическую работу с элементами, которые в противном случае мне пришлось бы делать по отдельности для отдельных элементов вектора один за другим.

Есть ли метод, который вы рекомендуете использовать, чтобы определить, является ли operation или function в R vectorized?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 26 октября 2019

Векторизация в 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 для простых элементарных операций, подумайте о том, как сделать это с помощью векторизации. При достаточной практике это станет для вас второй натурой. Для более подробной информации я могу порекомендовать это сообщение в блоге от Ноама Росса.

0 голосов
/ 26 октября 2019

В принципе это должно быть видно на странице справки, поэтому help(function) или ?function должны дать ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...