나는 절대적인 프로그래밍 초보자라고 말하면서 이것을 시작하고 싶으므로이 질문이 얼마나 기본적인지 용서해주십시오.
나는 R의 “원자”클래스에 대해 더 잘 이해하려고 노력하고 있으며 아마도 이것은 일반적으로 프로그래밍 클래스에 해당 될 것입니다. 문자, 논리 및 복잡한 데이터 클래스의 차이점을 이해하지만 숫자 클래스와 정수 클래스의 근본적인 차이점을 찾기 위해 고군분투하고 있습니다.
간단한 x <- c(4, 5, 6, 6)
정수 벡터가 있다고 가정 해 봅시다. 이것이 정수 클래스 인 것이 합리적입니다. 내가 할 때 class(x)
내가 얻을 [1] "numeric"
. 그런 다음이 벡터를 정수 클래스로 변환합니다 x <- as.integer(x)
. 클래스가 다르다는 점을 제외하고는 동일한 숫자 목록을 반환합니다.
내 질문은 왜 이것이 사실이며, 정수 집합에 대한 기본 클래스가 숫자 클래스 인 이유와 정수 대신 숫자로 정수를 설정하는 것의 장점과 단점은 무엇인지입니다.
답변
“숫자”클래스로 함께 그룹화되는 여러 클래스가 있으며, 그중 가장 일반적인 2 개는 double (배정 밀도 부동 소수점 숫자의 경우) 및 정수입니다. R은 필요할 때 숫자 클래스간에 자동으로 변환하므로 대부분의 경우 숫자 3이 현재 정수로 저장되어 있는지 또는 두 배로 저장되어 있는지는 일반 사용자에게 중요하지 않습니다. 대부분의 수학은 배정 밀도를 사용하여 수행되므로 종종 기본 저장소가됩니다.
정수가 저장 공간을 덜 필요로하므로 벡터가 double로 변환되지 않을 것임을 알고있는 경우 (ID 값 또는 인덱싱으로 사용됨) 특별히 벡터를 정수로 저장할 수 있습니다. 그러나 그것들을 double로 변환하는 수학에서 사용한다면, 처음부터 double로 저장하는 것이 가장 빠를 것입니다.
답변
먼저, R을 수년간 성공적으로 사용하는 것이 완벽하게 가능하며이 질문에 대한 답을 알 필요가 없습니다. R은 백그라운드에서 (일반적인) 숫자와 정수의 차이를 처리합니다.
> is.numeric(1)
[1] TRUE
> is.integer(1)
[1] FALSE
> is.numeric(1L)
[1] TRUE
> is.integer(1L)
[1] TRUE
(정수 뒤에 대문자 ‘L’을 넣으면 정수로 저장됩니다.)
보시다시피 “integer”는 “numeric”의 하위 집합입니다.
> .Machine$integer.max
[1] 2147483647
> .Machine$double.xmax
[1] 1.797693e+308
정수는 20 억이 조금 넘지 만 다른 숫자는 훨씬 더 클 수 있습니다. 배정 밀도 부동 소수점 숫자로 저장되기 때문에 더 클 수 있습니다. 이것은 숫자가 두 부분으로 저장된다는 것을 의미합니다. 지수 (위의 308과 같고, 밑이 10이 아닌 2를 제외하고)와 “유효”(위의 1.797693과 같은)입니다.
‘is.integer’는 정수가 있는지 여부를 테스트하는 것이 아니라 데이터가 저장되는 방식에 대한 테스트입니다.
주의해야 할 :
점은 시작점과 끝 점이 정수인 경우 콜론 연산자 는 정수를 반환한다는 것입니다. 예를 들어, 1에서 5까지의 숫자로 1:5
구성된 integer
벡터를 만듭니다 L
. 문자를 추가 할 필요가 없습니다 .
> class(1:5)
[1] "integer"
참조 : https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R
답변
도움말 페이지를 인용하려면 (try ?integer
), 굵게 표시된 부분은 다음과 같습니다.
정수 벡터는 데이터를 예상하는 C 또는 Fortran 코드로 전달할 수 있도록 존재하므로 (작은) 정수 데이터를 정확하고 간결하게 표현할 수 있습니다 .
R의 현재 구현은 정수 벡터에 32 비트 정수를 사용하므로 표현 가능한 정수의 범위는 약 +/- 2 * 10 ^ 9로 제한됩니다. double은 훨씬 더 큰 정수를 정확하게 보유 할 수 있습니다.
도움말 페이지에서 알 수 있듯이 R integer
은 부호가있는 32 비트 숫자이므로 -2147483648에서 +2147483647 사이를 유지하고 4 바이트를 차지할 수 있습니다.
R 은 IEEE 754 표준을 준수 numeric
하는 64 비트와 동일합니다 double
. R에는 단 정밀도 데이터 유형이 없습니다. (출처 : numeric
및의 도움말 페이지 double
). double은 정밀도를 잃지 않고 -2 ^ 53에서 2 ^ 53 사이의 모든 정수를 정확하게 저장할 수 있습니다.
벡터 ( source ) 의 오버 헤드를 포함한 데이터 유형 크기를 볼 수 있습니다 .
> object.size(1:1000)
4040 bytes
> object.size(as.numeric(1:1000))
8040 bytes
답변
내 이해에-우리는 데이터 유형으로 변수를 선언하지 않으므로 기본적으로 R은 L이없는 숫자를 숫자로 설정했습니다. 당신이 쓴 경우 :
> x <- c(4L, 5L, 6L, 6L)
> class(x)
>"integer" #it would be correct
정수의 예 :
> x<- 2L
> print(x)
숫자의 예 (다른 프로그래밍 언어의 double / float와 유사)
> x<-3.4
> print(x)