2011-10-30 14 views
5

Jestem zdziwiony tym zachowaniem w R. Po prostu chcę zrobić prosty ciąg porównywania listy łańcuchów wyprodukowanych przez strsplit. Więc nie rozumiem, dlaczego poniższe dwa pierwsze fragmenty kodu spełniają moje oczekiwania, a trzecie nie.Porównywanie ciągów w "klauzuli" w pętli w R prowadzi do "warunek ma długość> 1 i używany będzie tylko pierwszy element"?

> for (i in strsplit("A text I want to display with spaces", " ")) { print(i) } 
[1] "A"  "text" "I"  "want" "to"  "display" "with" "spaces" 

Ok, to ma sens ...

> for (i in strsplit("A text I want to display with spaces", " ")) { print(i=="want") } 
[1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE 

Ok, to też. Ale co jest nie tak z następującą konstrukcją?

> for (i in strsplit("A text I want to display with spaces", " ")) { if (i=="want")  print("yes") } 
Warning message: 
In if (i == "want") print("yes") : 
    the condition has length > 1 and only the first element will be used 

Dlaczego to nie drukuje "tak" po napotkaniu czwartego słowa? Co powinienem zmienić, aby uzyskać to pożądane zachowanie?

Odpowiedz

7

Problem polega na tym, że strsplit tworzy listę rozdzielonych ciągów znaków (w tym przypadku o długości 1, ponieważ dałeś tylko jeden ciąg do podziału).

ss <- strsplit("A text I want to display with spaces", " ") 
for (i in ss[[1]]) { 
    if (i=="want")  print("yes") 
} 

Można zobaczyć, co się dzieje, jeśli po prostu wydrukować elementy:

for (i in ss) { 
    print(i) 
} 

pierwszy element jest character wektorowych.

W zależności od tego, co robisz, można również rozważyć wektorowy porównań takich jak ifelse(ss=="want","yes","no")

+0

Ok, dzięki za wyjaśnienie! To był drugi test, który wprawił mnie w zakłopotanie: i == "chcę" wyprodukował sprawdzenie wszystkich słów w pierwszym wektorze znaku, zamiast używać i jako indeksu w otrzymanym wektorze. – yossarian

Powiązane problemy