2016-09-28 113 views
7

Program 1:Bunu kullanırken bir döngü değişkeninin adresi neden değişiyor?

library(pryr) 

for (x in 1:3) { 
    print(c(address(x), refs(x))) 
} 

çıkış, örneğin:

[1] "0x7a6a6c8" "1"   
[1] "0x7a6a6c8" "1"   
[1] "0x7a6a6c8" "1" 

Program 2:

library(pryr) 

for (x in 1:3) { 
    print(c(address(x), refs(x))) 
    print(x) 
} 

çıkış, örneğin:

[1] "0x7ae0298" "1"   
[1] 1 
[1] "0x7ae88c8" "1"   
[1] 2 
[1] "0x7af2668" "1"   
[1] 3 

Açıkçası x'in değeri değişiyor progra m 2, ama neden adresi de değişiyor? Döngü sırasında gc çağrılmıyorken, for döngüsü yaklaşık 500.000.000 kez çalışırken bu durum bellek sızıntılarına neden olabilir mi?

+2

Eğer bir R döngü ile çalıştırırsanız 5e8 yineleme, performans hakkında endişelenmeli ve bellek sızıntısı olmamalıdır (hiçbiri yoktur). – Roland

+1

R versiyonunuz nedir? Döngüsel değişken bir yerde kullanılmadıkça, R yeniden tahsis edilmekten kaçınır. Örneğin. (x in 1: 3) için {.Insal (denetle (x))} 'VS' için (1: 3'teki x) {(function (val) val) (x); .Internal (teftiş (x))}. ("X" üzerinde basit bir kapatma çağrısında, "x" işaretli olarak çok referanslı) –

+0

Sürüm 3.3.1 kullanıyorum, çıktıları da düzenleyeceğim. – Wipster

cevap

1

Döngünün sonunda (x) yazdırmak, @alexis_laz olarak belirtildiği gibi çok referans olarak işaretler. R dinamik bir dil olduğundan, bu kolayca gerçekleşebilir. Bu etkilerini test etmek için, refs çıkışını (x), baskı yazdırabilirsiniz (x) hakemler (x):

for (x in 1:3) { 
    print(refs(x)) 
    print(x) 
    print(refs(x)); cat("\n") 
} 

Çıktı:

[1] 1 
[1] 1 
[1] 2 

[1] 1 
[1] 2 
[1] 2 

[1] 1 
[1] 3 
[1] 2