Сравнение строк в "if-предложении" в цикле в R приводит к тому, что "условие имеет длину> 1 и будет использоваться только первый элемент"? - PullRequest
5 голосов
/ 30 октября 2011

Я озадачен этим поведением в R. Я просто хочу сделать простое сравнение строк списка строк, созданных strsplit. Поэтому не понимаю, почему следующие первые две части кода делают то, что я ожидал, а третья - нет.

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

Хорошо, это имеет смысл ...

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

Хорошо, это тоже. Но что не так со следующей конструкцией?

> 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

Почему это просто не печатает "да", когда встречается четвертое слово? Что я должен изменить, чтобы иметь это желаемое поведение?

1 Ответ

7 голосов
/ 30 октября 2011

Проблема в том, что strsplit создает список разделенных строк (в данном случае с длиной 1, потому что вы дали ему только одну строку для разделения).

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

Вы можете увидеть, что происходит, просто напечатав элементы:

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

первый элемент является character вектором.

В зависимости от того, что вы делаете, вы также можете рассмотреть векторизованные сравнения, такие как ifelse(ss=="want","yes","no")

...