정수 (0)를 잡는 방법?


136

integer(0)예 를 들어을 생성하는 명령문이 있다고 가정 해 봅시다.

 a <- which(1:3 == 5)

이것을 잡는 가장 안전한 방법은 무엇입니까?


R을 오류로 취급한다는 생각이 마음에 들지 않습니다. 실제로 빈 객체를 접지 않는 R의 정책은 많은 오류 복구 흐름을 피하는 데 도움이되므로 코드가 훨씬 깨끗합니다.
mbq

20
어느 것을 사용하지 마십시오.
hadley

1
로 테스트 할 수 있습니다 any. which(1:3==5)또는에 대해 FALSE를 반환합니다 1:3==5.
IRTFM 2016 년

@BondedDust 내가 찾을려고 integer(0)내가 사용하여 생산하는, which예를 들어.
Roman Luštrik

6
나는 이것이 오래되었다는 것을 알고 있지만, 당신은 왜 할 수 which없습니까? 이것은 잘못된 코드를 피하는 데 매우 도움이됩니다.
Cactus

답변:


162

길이가 0 인 벡터 (정수 1)를 인쇄하는 R의 방법이므로 a길이가 0인지 테스트 할 수 있습니다 .

R> length(a)
[1] 0

그것은 당신이 식별하기 위해 사용하는 전략을 재고 가치가있을 수도 있는 당신이 원하는 요소를하지만, 더 구체적인 정보없이 대안 전략을 제시하기는 어렵다.


19

구체적으로 길이가 0 인 정수 라면 다음과 같은 것을 원합니다.

is.integer0 <- function(x)
{
  is.integer(x) && length(x) == 0L
}

그것을 확인하십시오 :

is.integer0(integer(0)) #TRUE
is.integer0(0L)         #FALSE
is.integer0(numeric(0)) #FALSE

assertive이것을 위해 사용할 수도 있습니다 .

library(assertive)
x <- integer(0)
assert_is_integer(x)
assert_is_empty(x)
x <- 0L
assert_is_integer(x)
assert_is_empty(x)
## Error: is_empty : x has length 1, not 0.
x <- numeric(0)
assert_is_integer(x)
assert_is_empty(x)
## Error: is_integer : x is not of class 'integer'; it has class 'numeric'.

3
!length(x)오히려 사용할 수 있습니다length(x)==0
James

3
@ 제임스 사실, 나는 어느 정도의 성능 문제가 있다고 생각하지 않으며 length(x) == 0L더 명확하게 읽습니다.
Richie Cotton

@RichieCotton. 0과 반대로 0L은 어떻게됩니까? 인터넷 검색을 시도했지만 관련성이 없습니다. 네크로 맨시가 유감입니다.
eenblam

2
@Ben : L숫자에 접미사를 추가 하면 R이 부동 소수점 값이 아닌 정수로 저장합니다. 예를 들어, cran.r-project.org/doc/manuals/R-lang.html#Constants
Richie Cotton

감사! 시간이 절약되었습니다.
Andrii

12

아마 오프 주제,하지만, R은이 좋은, 논리적 벡터를 줄이기위한 신속하고 빈 인식 기능을 갖추고 - anyall:

if(any(x=='dolphin')) stop("Told you, no mammals!")

1
예,와 같은 것이 있다면 좋을 것입니다 is.empty. cuz 또는 integer(0)대신에 일부 함수가 반환 됩니다 . 그러나 지금은 가장 간단하고 벡터 방식으로 작동하므로보다 큰 이점이 있습니다. NANULLlength(a)
Ufos

7

Andrie의 답변에서 영감을 얻은 경우 identical해당 객체 클래스의 빈 세트라는 사실을 사용하여 속성 문제를 사용 하거나 피할 수 있으며 해당 클래스의 요소와 결합합니다.

attr(a,"foo")<-"bar"

> identical(1L,c(a,1L))
[1] TRUE

또는 더 일반적으로 :

is.empty <- function(x, mode=NULL){
    if (is.null(mode)) mode <- class(x)
    identical(vector(mode,1),c(x,vector(class(x),1)))
}

b <- numeric(0)

> is.empty(a)
[1] TRUE
> is.empty(a,"numeric")
[1] FALSE
> is.empty(b)
[1] TRUE
> is.empty(b,"integer")
[1] FALSE

이것은 가장 간단한 대답은 아니지만 초보자에게는 가장 간단하고 안전합니다.
JASC

7
if ( length(a <- which(1:3 == 5) ) ) print(a)  else print("nothing returned for 'a'") 
#[1] "nothing returned for 'a'"

두 번째 생각에 나는 length(.)다음 보다 더 아름답다고 생각합니다 .

 if ( any(a <- which(1:3 == 5) ) ) print(a)  else print("nothing returned for 'a'") 
 if ( any(a <- 1:3 == 5 ) ) print(a)  else print("nothing returned for 'a'") 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.