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


136

生成するステートメントがあるとしましょう integer(0)たとえば、。

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

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


私はそれをエラーとして扱うという考えは好きではありません。実際、特定の空のオブジェクトを折りたたまないというRのポリシーは、多くのエラー回復フローを回避するのに役立ち、したがって、コードがよりクリーンになります。
mbq

20
どちらを使用しないでください。
ハドリー

1
でテストできますanywhich(1:3==5)またはの場合はFALSEを返します1:3==5
IRTFM 2014年

@BondedDustを見つけようとしinteger(0)ていwhichましたが、例として使用して作成しました。
RomanLuštrik2014年

6
これは古いことはわかっていますが、ハドリー、使用しない理由を説明してくださいwhich。これは、不正なコードを回避するのに非常に役立ちます。
サボテン

回答:


162

これは、長さ0のベクトル(整数1)を出力するRの方法なのでa、長さ0 かどうかをテストできます。

R> length(a)
[1] 0

それはあなたが識別するために使用されている戦略再考する価値があるかもしれませんどのしたい要素を、それ以上の特定の詳細なしで、別の戦略を提案することは困難です。


19

具体的には長さがゼロの整数の場合、次のようなものが必要です

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ます。私にはもっとはっきりと読みます。
リッチーコットン

@RichieCotton。0とは対照的に0Lはどうなっていますか?私はグーグルで試しましたが、関連するものは何も見つかりません。ネクロマンシーについて申し訳ありません。
eenblam 2013

2
@ベン:Lサフィックスを数値に追加すると、Rはそれを浮動小数点値ではなく整数として格納します。例:cran.r-project.org/doc/manuals/R-lang.html#Constants
Richie Cotton

ありがとう!時間の節約になります。
Andrii

12

おそらく話題外ですが、Rは論理ベクトルを削減するための2つの素晴らしく、高速で空を認識する関数を備えています- anyall

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

1
ええ、何かのis.empty関数integer(0)NAやの代わりに返された場合は素晴らしいでしょうNULL。しかし今のところ、あなたの方法は最も簡単で、ベクトル的に機能しlength(a)ます。これはに比べて大きな利点です。
Ufos 2018

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.