Sık sık sembolü görülen 1L
(veya 2L
, 3L
vs.) R kodu görünür. Nedir arasındaki fark 1L
ve 1
? 1==1L
olarak değerlendirir TRUE
. 1L
R kodunda neden kullanılır?
Sık sık sembolü görülen 1L
(veya 2L
, 3L
vs.) R kodu görünür. Nedir arasındaki fark 1L
ve 1
? 1==1L
olarak değerlendirir TRUE
. 1L
R kodunda neden kullanılır?
Yanıtlar:
Böylece @James ve @Brian 3L'nin ne anlama geldiğini açıkladı . Ama neden kullanasın ki?
Çoğu zaman fark etmez - ancak bazen kodunuzun daha hızlı çalışmasını ve daha az bellek tüketmesini sağlamak için kullanabilirsiniz . Bir çift ("sayısal") vektör, eleman başına 8 bayt kullanır. Bir tamsayı vektörü eleman başına sadece 4 bayt kullanır. Büyük vektörler için, bu daha az boşa harcanan ve CPU için daha az harcanan şeydir (bu yüzden genellikle daha hızlıdır).
Çoğunlukla bu, endekslerle çalışırken geçerlidir. Bir tamsayı vektörüne 1 eklemenin onu bir çift vektöre dönüştürdüğü bir örnek:
x <- 1:100
typeof(x) # integer
y <- x+1
typeof(y) # double, twice the memory size
object.size(y) # 840 bytes (on win64)
z <- x+1L
typeof(z) # still integer
object.size(z) # 440 bytes (on win64)
... ancak tamsayılarla aşırı çalışmanın tehlikeli olabileceğini de unutmayın:
1e9L * 2L # Works fine; fast lean and mean!
1e9L * 4L # Ooops, overflow!
... ve @Gavin'in işaret ettiği gibi, tamsayıların aralığı kabaca -2e9 ila 2e9'dur.
Ancak bir uyarı, bunun mevcut R versiyonu (2.13) için geçerli olmasıdır. R bunu bir noktada değiştirebilir (64 bit tamsayılar tatlı olacaktır, bu da> 2e9 uzunluk vektörlerini etkinleştirebilir). Güvende .Machine$integer.max
olmak için, maksimum tamsayı değerine ihtiyaç duyduğunuzda (ve minimum değeri reddettiğinizde) kullanmalısınız.
object.size
. Faydalı olan, belirli bir tipte veri gerektirebilecek Fortran veya C koduna geçmektir.
object.size(1:100)
vs object.size(1:100+0)
400 bayt + bazı havai vs 800 bayt + bazı havai bu. Yukarıdaki örneği güncelledim.
c(1L, 2L, 3L, 4L,...100L)
vs gibi tüm bir vektörü oluşturduğunuz durumu düşünüyordum as.integer(c(1, 2, 3, 4,...100))
.
Gönderen Sabitler Bölüm ait R Dili Tanımı :
Herhangi bir sayıyı açık bir tamsayı yapmak amacıyla nitelendirmek için 'L' sonekini kullanabiliriz. Böylece '0x10L', onaltılı gösterimden 16 tam sayı değerini oluşturur. 1e3L sabiti, sayısal bir değer yerine 1000'i bir tamsayı olarak verir ve 1000L'ye eşdeğerdir. ('L' değerinin 3 yerine 1e3 terimini nitelediği kabul edilir.) 'L' ile bir tamsayı değeri olmayan bir değeri (örneğin 1e-3L) kabul edersek, bir uyarı alırız ve sayısal değer yarattı. Sayıda gereksiz bir ondalık nokta varsa, örneğin 1.L de bir uyarı oluşturulur.
Bir sabit için açıkça bir tamsayı değeri oluşturmak için bu işlevi işlev olarak adlandırın.
1 == 1L
verirTRUE
,identical(1, 1L)
verirFALSE
.