나는 종종 기호를 볼 1L(또는 2L, 3L등) R 코드에 나타납니다. 무슨 사이의 차이 1L와 1? 1==1L로 평가됩니다 TRUE. 1LR 코드에서 왜 사용됩니까?
나는 종종 기호를 볼 1L(또는 2L, 3L등) R 코드에 나타납니다. 무슨 사이의 차이 1L와 1? 1==1L로 평가됩니다 TRUE. 1LR 코드에서 왜 사용됩니까?
답변:
@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.