Saya sering melihat simbol 1L(atau 2L, 3L, dll) muncul dalam kode R. Apa perbedaan antara 1Ldan 1? 1==1Lmengevaluasi ke TRUE. Mengapa 1Ldigunakan dalam kode R?
Jadi, @ames dan @Brian menjelaskan apa artinya 3L. Tapi kenapa Anda menggunakannya?
Sebagian besar waktu tidak ada bedanya - tetapi kadang-kadang Anda dapat menggunakannya untuk membuat kode Anda berjalan lebih cepat dan mengkonsumsi lebih sedikit memori . Vektor ganda ("numerik") menggunakan 8 byte per elemen. Vektor integer hanya menggunakan 4 byte per elemen. Untuk vektor besar, itu memori yang terbuang lebih sedikit dan lebih sedikit untuk melewati CPU (jadi biasanya lebih cepat).
Sebagian besar ini berlaku ketika bekerja dengan indeks. Berikut adalah contoh di mana menambahkan 1 ke vektor integer mengubahnya menjadi vektor ganda:
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)
... tetapi juga perhatikan bahwa bekerja berlebihan dengan bilangan bulat bisa berbahaya:
1e9L*2L# Works fine; fast lean and mean!1e9L*4L# Ooops, overflow!
... dan seperti yang ditunjukkan oleh @Gavin, kisaran untuk bilangan bulat kira-kira -2e9 hingga 2e9.
Peringatan adalah bahwa ini berlaku untuk versi R saat ini (2.13). R mungkin mengubah ini di beberapa titik (bilangan bulat 64-bit akan menjadi manis, yang dapat memungkinkan vektor dengan panjang> 2e9). Agar aman, Anda harus menggunakan .Machine$integer.maxkapan pun Anda membutuhkan nilai integer maksimum (dan meniadakannya untuk minimum).
Saya pikir persyaratan memori oleh R adalah sama terlepas dari jenisnya, setidaknya menurut object.size. Apa yang berguna untuk melewati kode Fortran atau C yang mungkin memerlukan data dari jenis tertentu.
James
2
Tidak, coba object.size(1:100)vs. object.size(1:100+0)400 byte + overhead dan 800 byte + overhead. Saya memperbarui contoh di atas.
Tommy
2
Patut disebutkan bahwa integer overflow adalah karena penggunaan bilangan bulat bertanda 32-bit, karenanya dibatasi sekitar +/- 2 * 10 ^ 9, bahkan pada R-64-bit ...
Gavin Simpson
1
@ Zach juga jauh lebih pendek untuk mengetik :-)
Gavin Simpson
1
@ Gavin Simpson tentu saja. Aku benar-benar berpikir tentang situasi di mana Anda membuat seluruh vektor, seperti c(1L, 2L, 3L, 4L,...100L)vs as.integer(c(1, 2, 3, 4,...100)).
Kita dapat menggunakan akhiran 'L' untuk mengkualifikasi angka apa pun dengan maksud menjadikannya bilangan bulat eksplisit. Jadi '0x10L' menciptakan nilai integer 16 dari representasi heksadesimal. Konstanta 1e3L memberikan 1000 sebagai bilangan bulat daripada nilai numerik dan setara dengan 1000L. (Perhatikan bahwa 'L' diperlakukan sebagai kualifikasi istilah 1e3 dan bukan 3.) Jika kita memenuhi syarat nilai dengan 'L' yang bukan nilai integer, misalnya 1e-3L, kita mendapatkan peringatan dan nilai numeriknya adalah dibuat. Peringatan juga dibuat jika ada titik desimal yang tidak perlu dalam angka, misalnya 1.L.
Untuk secara eksplisit membuat nilai integer untuk sebuah konstanta Anda dapat memanggil fungsi as.integer atau lebih sederhana menggunakan akhiran "L".
1 == 1L
memberiTRUE
, tetapiidentical(1, 1L)
memberiFALSE
.Jawaban:
Jadi, @ames dan @Brian menjelaskan apa artinya 3L. Tapi kenapa Anda menggunakannya?
Sebagian besar waktu tidak ada bedanya - tetapi kadang-kadang Anda dapat menggunakannya untuk membuat kode Anda berjalan lebih cepat dan mengkonsumsi lebih sedikit memori . Vektor ganda ("numerik") menggunakan 8 byte per elemen. Vektor integer hanya menggunakan 4 byte per elemen. Untuk vektor besar, itu memori yang terbuang lebih sedikit dan lebih sedikit untuk melewati CPU (jadi biasanya lebih cepat).
Sebagian besar ini berlaku ketika bekerja dengan indeks. Berikut adalah contoh di mana menambahkan 1 ke vektor integer mengubahnya menjadi vektor ganda:
... tetapi juga perhatikan bahwa bekerja berlebihan dengan bilangan bulat bisa berbahaya:
... dan seperti yang ditunjukkan oleh @Gavin, kisaran untuk bilangan bulat kira-kira -2e9 hingga 2e9.
Peringatan adalah bahwa ini berlaku untuk versi R saat ini (2.13). R mungkin mengubah ini di beberapa titik (bilangan bulat 64-bit akan menjadi manis, yang dapat memungkinkan vektor dengan panjang> 2e9). Agar aman, Anda harus menggunakan
.Machine$integer.max
kapan pun Anda membutuhkan nilai integer maksimum (dan meniadakannya untuk minimum).sumber
object.size
. Apa yang berguna untuk melewati kode Fortran atau C yang mungkin memerlukan data dari jenis tertentu.object.size(1:100)
vs.object.size(1:100+0)
400 byte + overhead dan 800 byte + overhead. Saya memperbarui contoh di atas.c(1L, 2L, 3L, 4L,...100L)
vsas.integer(c(1, 2, 3, 4,...100))
.Dari Konstanta Bagian dari Definisi R Bahasa :
sumber
L menentukan tipe integer, dan bukan dua kali lipat dari kelas numerik standar.
sumber
Untuk secara eksplisit membuat nilai integer untuk sebuah konstanta Anda dapat memanggil fungsi as.integer atau lebih sederhana menggunakan akhiran "L".
sumber