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?
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?
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:
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).
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)vs as.integer(c(1, 2, 3, 4,...100)).
Dari Konstanta Bagian dari Definisi R Bahasa :
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 == 1LmemberiTRUE, tetapiidentical(1, 1L)memberiFALSE.