2012-11-26 1 views
11

자주 벡터의 길이, 데이터 프레임의 행 수 또는 행렬의 크기를 테스트 할 때 R 코드를 작성합니다 (예 : if (length(myVector) == 1)). 일부 기본 R 코드를 훑어 보면서, 그러한 비교 값에서 명시 적으로 정수로 명시되며 대체로 'L'접미사를 사용합니다 (예 : if (nrow(data.frame) == 5L)). 명시 적 정수는 함수 인수에 사용되기도합니다. 예를 들어 cor 함수의 이러한 문은 x <- matrix(x, ncol = 1L)apply(u, 2L, rank, na.last = "keep")입니다. 정수는 언제 R에 명시 적으로 지정해야합니까? 정수를 지정하지 않아서 잠재적으로 부정적인 결과가 있습니까? 1L 등을 사용하여언제 정수를 명시해야합니까?

+1

http://stackoverflow.com/q/7014387/602276과 매우 유사하며 질문에 대한 답변에 대해 espcially 대답을 참조하십시오. – Andrie

+0

@ Andrie- 질문과 답변을 지적 해 주셔서 감사합니다. 처음 검색 할 때 왜 나타나지 않았는지 알지 못합니다. – pistachionut

답변

2

그것이 무엇을 의미하는지에 관해서는 명시 적입니다 같이 프로그래밍 안전, 및 변환 등에 의존하지 않는

대화 형으로 코드를 작성하는 경우,이 오류를 발견하고 함께 해결하기 위해 쉽게 할 수있다 그런데 패키지를 작성하는 경우 (심지어 기본이 R) 명시적인 것이 더 안전합니다.

평등을 고려할 때 부동 소수점 숫자를 사용하면 정밀도 문제가 발생합니다. See this FAQ.

정수를 명시 적으로 지정하면 nrowlength으로, 인덱스 인수는 apply으로 반환하거나 정수가 필요합니다.

6

당신은 질문 :

이 정수를 지정하지 않는에서 어떤 잠재적으로 부정적인 결과가 있습니까?

상황이 더 중요 할 수 있습니다. 데이터 분석 p193 용 챔버 소프트웨어에서 : 정수의 절대 값 미만 2^m, 소수의 길이로

정수 값 정확하게 오랫동안 "더블"숫자로 표현 될 표현의 일부 (32 비트 시스템의 경우 2^54). 그러나

> (seq(-.45,.45,.15)*100)[3] 
[1] -15 
> (seq(-.45,.45,.15)*100)[3] == -15L 
[1] FALSE 

이 명시 적으로 입력의 예를 가지고 올 어렵습니다 :

그것은 당신이 값을 계산하는 경우는 정수처럼 보이지만 꽤 하나가 될 수있는 방법을 볼 어렵지 않다 정수이고 부동 소수점 표현에 정수가 아닙니다. Chambers가 설명하는 더 큰 값을 얻을 때까지.

+0

"32 비트 컴퓨터의 경우"그가 64 비트 더블에 대해 쓰고 있다고 생각하는 이유가 확실하지 않습니다. –

+0

32 비트 머신 (예 : 2 개의 32 비트 메모리 위치)에서 64 비트를 두 배로 사용하지 않습니까? –

+0

실제로 그들은 그렇습니다. 64 비트 컴퓨터에서도 64 비트를 사용합니다. –