ผมมักจะเห็นสัญลักษณ์1L
(หรือ2L
, 3L
ฯลฯ ) ปรากฏในรหัส R อะไรคือความแตกต่างระหว่าง1L
และ1
? ประเมิน1==1L
TRUE
เหตุใดจึง1L
ใช้รหัส R
ผมมักจะเห็นสัญลักษณ์1L
(หรือ2L
, 3L
ฯลฯ ) ปรากฏในรหัส R อะไรคือความแตกต่างระหว่าง1L
และ1
? ประเมิน1==1L
TRUE
เหตุใดจึง1L
ใช้รหัส R
คำตอบ:
@James และ @Brian อธิบายว่า 3L หมายถึงอะไร แต่ทำไมคุณถึงใช้มัน?
เวลาส่วนใหญ่ของมันทำให้ไม่แตกต่างกัน - แต่บางครั้งคุณสามารถใช้มันเพื่อให้ได้รหัสของคุณทำงานได้เร็วขึ้นและใช้หน่วยความจำน้อย เวกเตอร์คู่ ("ตัวเลข") ใช้ 8 ไบต์ต่อองค์ประกอบ เวกเตอร์จำนวนเต็มใช้ 4 ไบต์ต่อองค์ประกอบเท่านั้น สำหรับเวกเตอร์ขนาดใหญ่นั่นคือความจำที่สูญเปล่าน้อยกว่าและน้อยกว่าที่จะลุยให้กับซีพียู (โดยทั่วไปจะเร็วกว่า)
ส่วนใหญ่จะใช้เมื่อทำงานกับดัชนี นี่คือตัวอย่างที่การเพิ่ม 1 ลงในเวกเตอร์จำนวนเต็มจะเปลี่ยนเป็นเวกเตอร์คู่:
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)
... แต่โปรดทราบด้วยว่าการทำงานกับจำนวนเต็มมากเกินไปอาจเป็นอันตรายได้:
1e9L * 2L # Works fine; fast lean and mean!
1e9L * 4L # Ooops, overflow!
... และตามที่ @Ginin ชี้ให้เห็นช่วงของจำนวนเต็มประมาณ -2e9 ถึง 2e9
ข้อแม้คือว่าสิ่งนี้นำไปใช้กับรุ่น R ปัจจุบัน (2.13) R อาจเปลี่ยนแปลงสิ่งนี้ในบางจุด (จำนวนเต็ม 64- บิตจะหวานซึ่งสามารถเปิดใช้งานเวกเตอร์ที่มีความยาว> 2e9) เพื่อความปลอดภัยคุณควรใช้.Machine$integer.max
เมื่อใดก็ตามที่คุณต้องการค่าจำนวนเต็มสูงสุด (และคัดค้านค่าต่ำสุด)
object.size
เหมือนกันโดยไม่คำนึงถึงชนิดอย่างน้อยตาม สิ่งที่มีประโยชน์คือส่งผ่านไปยัง Fortran หรือรหัส C ซึ่งอาจต้องใช้ข้อมูลบางประเภท
object.size(1:100)
กับobject.size(1:100+0)
มัน 400 ไบต์ + ค่าใช้จ่ายบางส่วนกับ 800 ไบต์ + ค่าใช้จ่ายบางส่วน ฉันอัปเดตตัวอย่างด้านบน
c(1L, 2L, 3L, 4L,...100L)
as.integer(c(1, 2, 3, 4,...100))
จากค่าคงที่ของข้อกำหนดภาษา R :
เราสามารถใช้คำต่อท้าย 'L' เพื่อกำหนดหมายเลขใด ๆ โดยมีเจตนาทำให้เป็นจำนวนเต็มชัดเจน ดังนั้น '0x10L' จึงสร้างค่าจำนวนเต็ม 16 จากการแสดงเลขฐานสิบหก 1e3L คงที่ให้ 1,000 เป็นจำนวนเต็มแทนที่จะเป็นค่าตัวเลขและเทียบเท่ากับ 1000L (โปรดทราบว่า 'L' ถือว่าเป็นคำที่มีคุณสมบัติ 1e3 และไม่ใช่ 3) หากเรามีคุณสมบัติด้วย 'L' ที่ไม่ใช่ค่าจำนวนเต็มเช่น 1e-3L เราจะได้รับคำเตือนและค่าตัวเลขคือ สร้าง คำเตือนจะถูกสร้างขึ้นเช่นกันหากมีจุดทศนิยมที่ไม่จำเป็นในจำนวนเช่น 1.L
L ระบุประเภทจำนวนเต็มแทนที่จะเป็นสองเท่าของคลาสตัวเลขมาตรฐาน
> str(1)
num 1
> str(1L)
int 1
ในการสร้างค่าจำนวนเต็มอย่างชัดเจนสำหรับค่าคงที่คุณสามารถเรียกใช้ฟังก์ชัน as.integer หรือมากกว่านั้นโดยใช้คำต่อท้าย "L"
1 == 1L
ให้TRUE
แต่ให้identical(1, 1L)
FALSE