私はこの答えを書いて質問し、受け入れ答えの両方がRに悪いプログラミングスタイルを発揮するので:彼らはループのためのベクトルを拡大しています。 (円2Patrick Burns' The R Infernoを参照してください。)
この効果は簡単なベンチマークから明らかになるでしょう。タスクは、k
に整数1を含有するベクターx
を作成することである。
k <- 10000L
microbenchmark::microbenchmark(
grow = {
x <- integer(0)
for (i in seq.int(k)) x <- c(x, i)
x
},
subscript = {
x <- integer(k)
for (i in seq.int(k)) x[i] <- i
x
},
colon_operator = {
x <- 1L:k
x
},
times = 10L
)
#Unit: microseconds
# expr min lq mean median uq max neval
# grow 93491.676 96127.568 104219.0140 97123.627 99459.343 165545.063 10
# subscript 9067.607 9215.996 9483.0962 9551.288 9771.795 9938.307 10
# colon_operator 5.664 7.552 7.9675 8.307 8.685 9.063 10
それも、長さ10000の小さなベクトルのための要素を付加することは明らかだ予め必要な長さを割り当てるよりも遅い大きさです。組み込みのベクトル化された関数の利点を示すために、コロン演算子のタイミングをここに含めます。
したがって、効率を向上させるために問題の両方のコードとanswerを書き直す必要があります。
しかし、全体のコードははるかに簡潔な方法で再記述することができ
# initialize the random number generator for reproducible results
set.seed(1234L)
# allocate memory for the vectors beforehand
theta1_10 = numeric(k)
theta1_100 = numeric(k)
theta1_1000 = numeric(k)
theta1_10000 = numeric(k)
# Method1
for(i in seq.int(k)){
N10=runif(10)
N100=runif(100)
N1000=runif(1000)
N10000=runif(10000)
# update by subscripting
theta1_10[i] = (1/10)*4*sum(sqrt(1-N10^2))
theta1_100[i] = (1/100)*4*sum(sqrt(1-N100^2))
theta1_1000[i] = (1/1000)*4*sum(sqrt(1-N1000^2))
theta1_10000[i] = (1/10000)*4*sum(sqrt(1-N10000^2))
}
:
library(data.table)
set.seed(1234)
k <- 1000L
N <- 10^(1:4)
rbindlist(
lapply(N, function(i) {
theta1 <- replicate(k, 4/i * sum(sqrt(1 - runif(i)^2)))
data.table(N = i, mean = mean(theta1), sd = sd(theta1))
}))
# N mean sd
#1: 10 3.144974 0.27238683
#2: 100 3.140716 0.09040696
#3: 1000 3.141791 0.02654225
#4: 10000 3.141585 0.00886737
出典
2017-04-01 13:55:43
Uwe
' '1'の方法は何ですか?あなたは 'vba'でコーディングしていません。あなたがコメントをしたいのであれば、代わりに '#'を使用してください!しかしそれはあなたの問題ではありません。 – Masoud
fortaの前に 'theta1_10'を' theta1_100000'に初期化する必要があります。たとえば、 'theta1_10 = vector(、k)' – TooYoung
[新しい項目を追加するために空のRベクトルを作成する方法]の複製が可能です(http://stackoverflow.com/questions/3413879/how-to-create-an-empty -r-vector-to-new-items) – vincentmajor