Ich schreibe diese Antwort, weil sowohl die Frage als auch die Antwort akzeptiert schlechten Programmierstil in R demonstrieren: Sie sind für die Schleife einen Vektor in einem wächst. (Siehe Circle 2
Der Effekt wird aus einem einfachen Benchmark deutlich werden. Die Aufgabe ist es, einen Vektor x
zu schaffen, die die ganzzahlige Zahlen von 1 bis k
enthalten:
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
Es ist offensichtlich, dass auch bei einem kleinen Vektor der Länge 10000 Anfügen Elemente ist eine Größenordnung langsamer ist als zuvor die erforderliche Länge zuordnet. Das Timing des Doppelpunktoperators ist hier enthalten, um den Nutzen der integrierten vektorisierten Funktionen zu demonstrieren.
Also beide Codes in Frage und answer müssen neu geschrieben werden, um Subskribierung zu verwenden, um die Effizienz zu verbessern.
# 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))
}
kann jedoch der gesamte Code in einer viel prägnanter Weise neu geschrieben werden:
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
Was ist ' 'Methode 1'? Sie codieren nicht in 'vba'. Wenn Sie einen Kommentar wünschen, verwenden Sie stattdessen '#'! Das ist jedoch nicht dein Problem. – Masoud
Sie müssen 'theta1_10' zu' theta1_100000' vor der for-Schleife initialisieren. Zum Beispiel 'theta1_10 = vector (, k)' – TooYoung
Mögliches Duplikat von [So erstellen Sie einen leeren R-Vektor, um neue Elemente hinzuzufügen] (http://stackoverflow.com/questions/3413879/how-to-create-an-empty -r-vector-to-add-new-items) – vincentmajor