나는 종종 기호를 볼 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 바이트 만 사용합니다. 큰 벡터의 경우 메모리 낭비가 적고 CPU 사용이 줄어 듭니다 (일반적으로 더 빠릅니다).
대부분 인덱스로 작업 할 때 적용됩니다. 다음은 정수 벡터에 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!
... @Gavin이 지적했듯이 정수의 범위는 대략 -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)
vs 와 같은 전체 벡터를 만드는 상황을 정말로 생각하고있었습니다 as.integer(c(1, 2, 3, 4,...100))
.
1 == 1L
제공TRUE
하지만identical(1, 1L)
제공합니다FALSE
.