Rで出力をベクトルとして取得するにはどうすればよいですか?
たとえば、私がしたい場合
for (i in 1:1000) {if i mod 123345 = 0, a = list(i)}
a
i
しかし、最大のものだけでなく、123345 (つまり、因数) に均等に分割されるすべてのものを見つけたいと思います。
これを行うにはもっと簡潔な方法があるかもしれませんが、私はこのようにします:
i <- 1:1000
j <- i[12345 %% i == 0 ]
結果のベクトルj
には、12345 の因数である i の値のベクトルが含まれます。R では、モジュロ演算子は %% であり、自分で検索するときに見つけるのは少し難しいです。+
これは算術演算子のヘルプ ドキュメントに埋もれており、次のように引用符で囲む必要があるものを検索することで見つけることができます?"+"
。
VBA の回答を見つけたい場合は、VBA タグを追加することをお勧めします。しかし、VBAモジュロ演算子が関係していると思います;)
JD Long の方法が最初に思い浮かびましたが、別の方法です。
Filter(function(x) !(12345 %% x), 1:1000)
明示的な割り当ての必要性を避けるのは、ちょっと楽しいと思います。(毎回新しい関数を作成するのはちょっと残念です。) (この場合、「!」はゼロ以外の値を FALSE に、ゼロを TRUE に変換します。「フィルター」は、TRUE と評価される各要素を選択します。)
また、別の割り当ての必要性を回避し、新しい関数を作成しない:
which(!(12345 %% 1:1000))
タイミング:
> y <- 1:1000
> system.time(replicate(1e5, y[12345 %% y == 0 ]))
user system elapsed
8.486 0.058 8.589
> system.time(replicate(1e5, Filter(function(x) !(12345 %% x), y)))
Timing stopped at: 90.691 0.798 96.118 # I got impatient and killed it
# Even pulling the definition of the predicate outside,
# it's still too slow for me want to wait for it to finish.
# I'm surprised Filter is so slow.
> system.time(replicate(1e5, which(!12345 %% y)))
user system elapsed
11.618 0.095 11.792
したがって、JD Long の方法が勝者のようです。
あなたが書いた:
for (i in 1:1000) {if i mod 123345 = 0, a = list(i)} a
JD Long のコードははるかに優れていますが、この愚かな戦略を機能させたい場合は、代わりに以下を試してください。
a <- vector(mode="list"); for (i in 1:1000) {if (123345 %% i == 0){ a <-c(a,i) } }
as.vector(unlist(a))