Rでのベクトル化とは、基本的に、ループ処理がCやFORTRANなどのより高速なコンパイル済み言語に移動することを意味します。そのためには、問題のベクトルが「アトミック」である必要があります。つまり、「フラット」で均質である必要があります。また、で確認できるベクトルタイプは、typeof()
実行される操作に対して意味があるはずです。アトミックな場合は、ベクトル化されます。
ベクトルがアトミックかどうかは、を使用して確認できis.atomic()
ます。ベクトル化されない別のタイプのベクトルは「再帰的」と呼ばれ、を使用して確認できますis.recursive()
。再帰的オブジェクトには、任意のタイプの他のオブジェクトを含めることができます。つまり、それらは異種混合にすることができます。リストとデータフレームは再帰的です。
次のようなことを試して、アトミックvs再帰の洞察を得てください。
# 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ループの作成を考えるときはいつでも、ベクトル化を使用してそれを行う方法を考えてください。十分な練習をすれば、それはあなたにとって第二の性質になります。詳細については、Noam Rossのこのブログ投稿をお勧めします。