Rの関数または演算がベクトル化されていることをどのようにして知ることができますか?


8

私はまだ学んでいRます。かどうかを確認するためにいくつかの自動化された方法があるR operationfunctionですがvectorizedRオブジェクトがであるかどうかを識別するにはvector、を使用できますis.vector(x)。これはTRUExがベクトルであるかどうかを返しますFalse。同様のものはありvectorizedますか?

例えば:

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

+はベクトル化されているため、のadds個々の要素を持つベクトルの個々の要素は自動的xy。それ以外の場合は、forループを使用して同様の出力を達成する必要があります。

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

これまでのところ、この用語の限られた理解では、Vectorized要素の自動操作が必要でしたが、そうでなければ、ベクトルの個々の要素に対して1つずつ行う必要がありました。

あなたがどうかを確認するために使用することをお勧めします方法があるoperationfunctionではRあるがvectorized

ありがとうございました。

回答:


3

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のこのブログ投稿をお勧めします。


@AnonMousyがお手伝いいたします。回答が役に立った場合は、√をクリックして承認済み回答として選択することを検討してください。そうすれば、同様の質問を持つ他の人が何がうまくいったかを知っています。
-gersht

0

原則として、ヘルプページから明らかになる help(function)?function、答えを出す必要があります。


これが推奨される開始点です。作成するプログラムで可能な限りベクトル化された関数を使用する場合は、少し負荷が増える可能性があります。
Anon Mousy

1
これは実際には質問の答えにはなりません。これはRTMへの提案にすぎません。
IRTFM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.