как использовать str_detect как FALSE в операторе if r для добавления значения - PullRequest
1 голос
/ 07 мая 2020

У меня есть следующий вектор хэштегов:

hashtags <- c("#data", "#datascience", "#datascienceiscool")

И я пытаюсь написать код, который говорит, если строка НЕТ (в этом примере скажем "#datascienceinR"), затем добавьте его в вектор. Если он есть, никаких других действий предпринимать не нужно. Я пробовал это:

library(tidyverse)
all_hashtags <- if(str_detect(hashtags, "#datascienceinR") = FALSE) {
  append(hashtags, "#datascienceinR")
}

Но я получаю эту ошибку:


Error: unexpected '=' in "all_hashtags <- if(str_detect(hashtags, "#datascienceinR") ="
>   append(hashtags, "#datascienceinR")
[1] "#data"             
[2] "#datascience"      
[3] "#datascienceiscool"
[4] "#datascienceinR"   
> }
Error: unexpected '}' in "}"

Есть предложения?

1 Ответ

1 голос
/ 07 мая 2020

= является оператором присваивания, а не == (оператор сравнения)

if(str_detect(hashtags, "#datascienceinR") = FALSE)
                                           ^

Кроме того, вместо выполнения == FALSE лучше отрицать (!)

!str_detect(hashtags, "#datascienceinR")

Третья проблема заключается в использовании if/else, поскольку if/else ожидает логический вектор длины 1 и не более одного. Здесь «хэштеги» - это вектор длины 3, а str_detect также возвращает логический вектор такой же длины ИСТИНА / ЛОЖЬ. Итак, нам нужно обернуть с помощью all

all_hashtags <- if(all(!str_detect(hashtags, "#datascienceinR"))) {
       append(hashtags, "#datascienceinR")
 } 

all_hashtags
#[1] "#data"              "#datascience"       "#datascienceiscool" "#datascienceinR"

Его также можно записать с помощью union (при условии, что нет повторяющихся элементов)

hashtags <- union(hashtags, "datascienceinR")  

Если есть являются повторяющимися элементами, и я хочу их сохранить, другой вариант: vunion из vecsets

library(vecsets)
hashtags <- vunion(hashtags, "datascienceinR")  
...