R - So testen Sie das Zeichen (0) in der IF-Anweisung

74

Ich stelle mir vor, das ist unglaublich einfach, aber ich kann die Antwort nicht finden.

Ich schreibe eine IF-Anweisung, aber der Test ist, ob das Objekt einen character(0)Wert zurückgibt . Ich bin mir nicht sicher, wie ich character(0)in der Erklärung damit umgehen soll .

Angenommen Test <- character(0)oder ein Wert:

if (identical(Pols4,character(0))) {
  print('Empty')
} else {
  print('Not Empty')
}

Es scheint immer noch nicht zu funktionieren .....

Methexis
quelle
2
length(character(0))ist Null, if (length(x))sollte es auch tun.
Tonytonov
5
Nein, tut mir leid, das tut es nicht. length(NULL)ist auch Null und length(numeric(0))auch.
Patrick Roocks
3
Ändern Sie Ihre erste Zeile in if(identical(Test, character(0)))hat nicht funktioniert?
David Arenburg
Die if else-Anweisung löst einen Fehler aus: Unerwartetes '}' in "}"
Methexis
1
Was ist Pols4? Es funktioniert fürTest
David Arenburg

Antworten:

94

Verwenden Sie die identicalFunktion, um dies zu überprüfen.

a <- character(0)
identical(a, character(0))  # returns TRUE

identical(a, "")           # returns FALSE
identical(a, numeric(0))   # returns also FALSE
Patrick Roocks
quelle
1
Ich habe FALSEbis zu meiner Verwendung immer noch eine Rückgabe erhalten, identical(a,as.Date(character(0))da der Wert auch dann angezeigt wurde character(0), nachdem ich das Ergebnis als Datum früher in meinem Code umgewandelt hatte.
Climbs_lika_Spyder
1
Wenn Sie einen Wert in Datum umwandeln, ist dieser nicht identisch mit character(0), sodass dieses Verhalten vollkommen in Ordnung ist. quote(character(0))wird auch wie character(0)in der Konsole angezeigt und ist definitiv nicht identisch mit character(0).
Patrick Roocks
1
Ich habe mich nicht beschwert. Ich habe nur geteilt, falls andere einen ähnlichen Fall haben.
Climbs_lika_Spyder
aus a == character(0)logical(0)TRUE
neugier
Weil ==funktioniert vektorweise (vgl. c("a","b")==c("a","c")Rückgabe c(TRUE,FALSE)) und character(0)ein "Vektor vom Typ 'Zeichen' der Länge 0" ist (vgl. c("a", character(0))Identisch mit "a"). Daher ist ein "Vektor vom Typ 'logisch' der Länge 0" ein solides Ergebnis.
Patrick Roocks
10

Hinzufügen der obligatorischen tidyverse Antwort. Das rlangPaket hat die Funktion is_empty(), die genau das tut, was Sie wollen.

Test <- character(0)
rlang::is_empty(Test)
#[1] TRUE

Dies funktioniert auch für leere Vektoren, die keine Zeichen sind. Zum Beispiel funktioniert es in dem Fall, den Patrick Roocks in Kommentaren beschreibt.

Test <- as.Date(character(0))
rlang::is_empty(Test)
#[1] TRUE

Das Laden des 'tidyverse'-Pakets wird ebenfalls geladen is_empty().

Andrew Brēza
quelle
2
is_empty()ist auch inpurrr
Oliver
7

Verwenden Sie die Methode length ():

> check <- function(value) {
+ if (length(value)==0) {
+ print('Empty')
+ } else {
+ print('Not Empty')
+ }
+ }
> check("Hello World")
[1] "Not Empty"
> check("")
[1] "Not Empty"
> check(character(0))
[1] "Empty"
amagard
quelle
funktioniert bei mir nicht
Helen
5

Viele Menschen vergessen, dass Funktionen wie str_locate_all()erfordern %>% unlist()oder %>% .[[1]].

Dann können Sie character(0)mit der length()Funktion leicht erkennen, dass Sie beispielsweise if > 0die Ausgabe sicher verwenden können str_locate_all().

Beispiel:

value <- str_extract_all("kvk :", ascii_digit(8,8)) %>% unlist()
if (length(value) > 0) {
  # Do something
}
Emmanuel Chamilakis
quelle
1

Meine Methode zur Lösung dieses Problems besteht darin, diese Spalte nur zu bearbeiten, indem ich sie erneut in ein Zeichen umwandle und stattdessen "Zeichen (0)" finde.

Zum Beispiel:

df$interest_column <- as.character(df$interest_column) # Cast it into a character again
df[df$interest_column == "character(0)","interest_column"] <- NA  # Assign new value

Ich hoffe, dies ist eine Lösung, nach der Sie gefragt haben.

Jintachart Wyldes Chartpanich
quelle
0

statt length()für mich gearbeitetnrows()

Bruno Gomes
quelle