Tôi thường thấy các biểu tượng 1L
(hoặc 2L
, 3L
, vv) xuất hiện trong mã R. Sự khác biệt giữa 1L
và là 1
gì? 1==1L
đánh giá để TRUE
. Tại sao được 1L
sử dụng trong mã R?
Tôi thường thấy các biểu tượng 1L
(hoặc 2L
, 3L
, vv) xuất hiện trong mã R. Sự khác biệt giữa 1L
và là 1
gì? 1==1L
đánh giá để TRUE
. Tại sao được 1L
sử dụng trong mã R?
Câu trả lời:
Vì vậy, @James và @Brian đã giải thích ý nghĩa của 3L. Nhưng tại sao bạn lại sử dụng nó?
Hầu hết thời gian nó không có sự khác biệt - nhưng đôi khi bạn có thể sử dụng nó để mã của bạn chạy nhanh hơn và tiêu thụ ít bộ nhớ hơn . Một vectơ kép ("số") sử dụng 8 byte cho mỗi phần tử. Một vectơ số nguyên chỉ sử dụng 4 byte cho mỗi phần tử. Đối với các vectơ lớn, đó là bộ nhớ ít lãng phí hơn và ít phải lội qua CPU hơn (vì vậy nó thường nhanh hơn).
Chủ yếu là điều này áp dụng khi làm việc với các chỉ số. Đây là một ví dụ trong đó việc thêm 1 vào một vectơ số nguyên biến nó thành một vectơ kép:
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)
... nhưng cũng lưu ý rằng làm việc quá mức với số nguyên có thể nguy hiểm:
1e9L * 2L # Works fine; fast lean and mean!
1e9L * 4L # Ooops, overflow!
... và như @Gavin đã chỉ ra, phạm vi cho các số nguyên là khoảng -2e9 đến 2e9.
Một điều lưu ý là điều này áp dụng cho phiên bản R hiện tại (2.13). R có thể thay đổi điều này tại một số điểm (số nguyên 64 bit sẽ rất ngọt, có thể cho phép các vectơ có độ dài> 2e9). Để an toàn, bạn nên sử dụng .Machine$integer.max
bất cứ khi nào bạn cần giá trị số nguyên tối đa (và phủ nhận giá trị đó ở mức tối thiểu).
object.size
. Những gì nó hữu ích cho việc chuyển đến mã Fortran hoặc C có thể yêu cầu dữ liệu của một loại cụ thể.
object.size(1:100)
so với object.size(1:100+0)
400 byte + một số chi phí so với 800 byte + một số chi phí chung. Tôi đã cập nhật ví dụ trên.
c(1L, 2L, 3L, 4L,...100L)
vs as.integer(c(1, 2, 3, 4,...100))
.
Từ phần Hằng số của Định nghĩa Ngôn ngữ R :
Chúng ta có thể sử dụng hậu tố 'L' để đủ điều kiện cho bất kỳ số nào với mục đích biến nó thành một số nguyên rõ ràng. Vì vậy, '0x10L' tạo giá trị nguyên 16 từ biểu diễn thập lục phân. Hằng số 1e3L cho 1000 dưới dạng số nguyên thay vì giá trị số và tương đương với 1000L. (Lưu ý rằng 'L' được coi là đủ điều kiện 1e3 chứ không phải 3.) Nếu chúng tôi đủ điều kiện một giá trị với 'L' không phải là giá trị nguyên, ví dụ: 1e-3L, chúng tôi nhận được cảnh báo và giá trị số là tạo. Một cảnh báo cũng được tạo nếu có một số thập phân không cần thiết trong số, ví dụ: 1.L.
Để rõ ràng tạo một giá trị số nguyên cho hằng số, bạn có thể gọi hàm as.integer hoặc đơn giản hơn là sử dụng hậu tố "L".
1 == 1L
choTRUE
, nhưngidentical(1, 1L)
choFALSE
.