`1L`과`1`의 차이점은 무엇입니까?


152

나는 종종 기호를 볼 1L(또는 2L, 3L등) R 코드에 나타납니다. 무슨 사이의 차이 1L1? 1==1L로 평가됩니다 TRUE. 1LR 코드에서 왜 사용됩니까?


18
참고 : 1 == 1L제공 TRUE하지만 identical(1, 1L)제공합니다 FALSE.
CJB

답변:


129

@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을 위해서는 최대 정수 값이 필요할 때마다 사용해야 합니다 (최소값은 무시).


1
R에 의한 메모리 요구 사항은 적어도에 따르면 유형에 관계없이 동일하다고 생각합니다 object.size. 유용한 것은 특정 유형의 데이터가 필요한 Fortran 또는 C 코드로 전달하는 것입니다.
James

2
아니, 시도 object.size(1:100)object.size(1:100+0)는 400 바이트 + 오버 헤드 대 800 바이트 + 오버 헤드입니다. 위의 예를 업데이트했습니다.
Tommy

2
정수 오버플로는 32 비트 부호있는 정수를 사용하기 때문에 64 비트 R에서도 약 +/- 2 * 10 ^ 9로 제한됩니다.
Gavin Simpson

1
그것은 또한 :-) 유형에 많은 짧은 @Zach
개빈 심슨

1
물론 @Gavin Simpson. c(1L, 2L, 3L, 4L,...100L)vs 와 같은 전체 벡터를 만드는 상황을 정말로 생각하고있었습니다 as.integer(c(1, 2, 3, 4,...100)).
Zach

54

R 언어 정의상수 섹션 에서 :

'L'접미사를 사용하여 명시 적 정수로 만들려는 숫자로 한정 할 수 있습니다. 따라서 '0x10L'은 16 진수 표현에서 정수 값 16을 만듭니다. 상수 1e3L은 1000을 숫자 값이 아닌 정수로 제공하며 1000L과 같습니다. ( 'L'은 3이 아닌 1e3이라는 용어를 한정하는 것으로 간주됩니다.) 정수 값이 아닌 'L'(예 : 1e-3L)이 아닌 값을 한정하면 경고가 표시되고 숫자 값은 만들어진. 숫자에 불필요한 소수점이 있으면 경고도 생성됩니다 (예 : 1.L).


46

L은 표준 숫자 클래스의 배가 아닌 정수 유형을 지정합니다.

> str(1)
 num 1
> str(1L)
 int 1

2

상수의 정수 값을 명시 적으로 만들려면 as.integer 함수를 호출하거나 "L"접미사를 사용하면됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.