web-dev-qa-db-ja.com

integer(0)をキャッチする方法は?

integer(0)を生成するステートメントがあるとします。

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

これをキャッチする最も安全な方法は何ですか?

112
Roman Luštrik

これは、長さゼロのベクトル(整数1)を出力するRの方法です。したがって、長さ0のaをテストできます。

R> length(a)
[1] 0

which必要な要素を識別するために使用している戦略を再考する価値があるかもしれませんが、さらに具体的な詳細がなければ、代替戦略を提案することは困難です。

141
Gavin Simpson

長さが特にゼロ整数の場合、次のようなものが必要です。

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'.
17
Richie Cotton

トピックから外れているかもしれませんが、Rには、論理ベクトルを削減するための2つのNice、Fast、Empty対応の機能があります-anyおよびall

if(any(x=='dolphin')) stop("Told you, no mammals!")
12
mbq
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'") 
7
42-

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
6
James