Ich glaube nicht, dass die Zunahme der Zeit mit Zugriffszeit zusammenhängt, sondern eher durch das Erstellen von Kopien. Bei jeder dieser Zuordnungen wird eine Kopie des Vektors erstellt. Sie können dies mit tracemem
testen.
# initialize vector (10 zeros)
tracemem({vec <- integer(10)})
[1] "< 0000000011D48720>"
# assign value to 7th position
tracemem({vec[7] <- 6L})
tracemem [0x0000000011d48720 -> 0x00000000111a02b0]:
[1] "< 0000000012E25468>"
Wenn der Vektor größer wird, nimmt die Zeit, die mit dem Kopiervorgang verbunden ist, zu.
Ferner ist zu beachten, dass eine ganze Zahl vec <- (1:(i*1000))
Vektor ist, und schaltet sich vec[1] <- 0
VEC in ein Doppelvektor, der in etwa verdoppelt die Größe des Vektors im Speicher.
Zuerst erstellen wir den Ganzzahlvektor und überprüfen seine Größe und seinen Typ.
# start over with similar syntax to question
tracemem({vec <- 1:10})
[1] "< 0000000011E55508>"
# Kontrollgröße object.size (VEC)
88 Bytes
# check type
typeof(vec)
Jetzt
[1] "integer"
, zuordnen 0 bis 7. Position und Wiederprüfung Größe und Typ. 0 scheint derselbe Wert zu sein wie der anfänglich vorhandene Wert, ist aber tatsächlich eher ein Double als eine ganze Zahl.
# assign value
tracemem({vec[7] <- 0})
tracemem [0x0000000011e55508 -> 0x0000000]:
tracemem [0x0000000-> 0x0000000013394740]:
[1] "< 00000000130EBA60>"
# check size
object.size(vec)
168 Bytes
# check type
typeof(vec)
[1] "double"
Hinweis hier, dass es zwei separate Kopie Anweisungen. Meine Vermutung ist, dass die erste die Kopie ist, um den Vektor von Integer in Double zu konvertieren, und die zweite ist die Zuweisung.
Um den Vektor als Ganzzahlvektor zu behalten, verwenden Sie stattdessen vec[1] <- 0L
, da "L" R mitteilt, dass eine ganze Zahl gewünscht wird.
Beachten Sie, dass dieses Kopierverhalten tracemem
sowohl mit Rstudio und Rgui in MS R offen 3.2.5 mit Windows 7.
Huh beobachtet? Ich sehe keinen data.frame irgendwo in der Nähe dieses Codes. – Frank