Wie fange ich eine ganze Zahl (0)?

136

Nehmen wir an, wir haben eine Aussage, die integer(0)z

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

Was ist der sicherste Weg, dies zu fangen?

Roman Luštrik
quelle
Ich mag die Idee, es als Fehler zu behandeln, nicht - tatsächlich hilft Rs Politik, bestimmte leere Objekte nicht zu reduzieren, viele Fehlerbehebungsabläufe zu vermeiden und führt somit zu viel saubererem Code.
mbq
20
Benutze nicht welche.
Hadley
1
Sie können mit testen any. Es wird FALSE für entweder which(1:3==5)oder für zurückgeben 1:3==5.
IRTFM
@BondedDust Ich habe versucht zu finden integer(0), was ich am whichBeispiel produziert habe.
Roman Luštrik
6
Ich weiß, dass dies alt ist, aber könnten Sie, Hadley, bitte umreißen, warum Sie es nicht verwenden sollten which? Dies wäre sehr hilfreich für mich, um schlechten Code zu vermeiden.
Kaktus

Antworten:

162

Auf diese Weise druckt R einen Vektor mit der Länge Null (eine Ganzzahl Eins), sodass Sie testen können, ob aer die Länge 0 hat:

R> length(a)
[1] 0

Es könnte sich lohnen, die Strategie, mit der Sie die gewünschten Elemente identifizieren, zu überdenken. Ohne weitere spezifische Details ist es jedoch schwierig, eine alternative Strategie vorzuschlagen.

Gavin Simpson
quelle
19

Wenn es sich speziell um Ganzzahlen mit der Länge Null handelt , möchten Sie so etwas wie

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

Überprüfen Sie es mit:

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

Sie können dies auch verwenden 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'.
Richie Cotton
quelle
3
Sie könnten einfach !length(x)eher alslength(x)==0
James
3
@James. Stimmt, aber ich glaube nicht, dass es so oder so ein großes Leistungsproblem gibt, und length(x) == 0Llese mir klarer vor.
Richie Cotton
@ RichardCotton. Was ist los mit 0L im Gegensatz zu 0? Ich habe versucht, es zu googeln, aber ich finde nichts Relevantes. Entschuldigung für die Nekromantie.
Eenblam
2
@Ben: Wenn Sie einer LZahl ein Suffix hinzufügen, speichert R es als Ganzzahl und nicht als Gleitkommawert. Siehe z. B. cran.r-project.org/doc/manuals/R-lang.html#Constants
Richie Cotton
Vielen Dank! Das hat mir Zeit gespart.
Andrii
12

Vielleicht nicht zum Thema gehörend, aber R bietet zwei nette, schnelle und leere Funktionen zum Reduzieren logischer Vektoren - anyund all:

if(any(x=='dolphin')) stop("Told you, no mammals!")
mbq
quelle
1
Ja, wäre toll, wenn es so etwas is.emptygäbe, denn einige Funktionen kehren integer(0)anstelle von NAoder zurück NULL. Aber im Moment ist Ihr Weg der einfachste und funktioniert vektoriell, was ein großer Vorteil gegenüber ist length(a).
Ufos
7

Inspiriert von Andries Antwort könnten Sie identicalAttributprobleme verwenden und vermeiden, indem Sie die Tatsache verwenden, dass es sich um die leere Menge dieser Objektklasse handelt, und sie mit einem Element dieser Klasse kombinieren:

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

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

Oder allgemeiner:

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
James
quelle
Dies ist nicht die einfachste Antwort, aber bei weitem die einfachste und sicherste für Anfänger.
JASC
7
if ( length(a <- which(1:3 == 5) ) ) print(a)  else print("nothing returned for 'a'") 
#[1] "nothing returned for 'a'"

Beim zweiten Gedanken finde ich, dass jeder schöner ist als 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'") 
IRTFM
quelle