/ / Помилка під час виконання оператора if у R - r, обробка тексту

Помилка під час виконання оператора if в R - r, обробка тексту

У мене є ця невеличка функція для отримання оцінки асонансу для тексту

getAssonanceScore <- function(book, count) {
#for each sentence

for (i in length(book[[1]])){
words <- strsplit(book[i], "\ ")

for (j in length(words[[1]])){
if (substr(words[[1]][j],1,1) == substr(words[[1]][j+1],1,1) ) {
count <- count + 1
}

}

}

count <- count / length(book)

return (count)
}

Це робить те, що він отримує список з одним рядкомтексту на першій позиції та другий рядок тексту на другій позиції тощо. Отримавши цей рядок, він розбиває речення і включає його до списку, що містить усі складові слова. Що я з цим роблю, так це те, що я порівнюю першу літеру першого слова з першою літерою другого слова, і першу літеру другого слова з першою літерою 3-ї, щоб отримати загальний бал асонансу. Потім це ділиться на тривалість книги. Коли я намагаюся перевірити цю функцію за допомогою невеликого вхідного списку "слово" форми:

> words
[1] "babbling brook by blue grass"

це дає мені цю помилку:

> Error in if (substr(words[[1]][j], 1, 1) == substr(words[[1]][j + 1],
> :    missing value where TRUE/FALSE needed

Я працюю в RStudio, і я дуже новачок у R, будь-яка допомога буде дуже вдячна. Дякую!

EDIT: Це має бути getAlliterationScore замість getAssonanceScore: D

Відповіді:

3 для відповіді № 1

for j in length(words[[1]]) не робить того, що ви очікуєте; j лише колись дорівнює повній довжині списку. Це також означає, що j + 1 біжить з кінця списку (так що words[[1]][j + 1] повертає NA)

Змініть свій for циклічна лінія до

        for (j in seq_len(length(words[[1]]) - 1)) {

Зараз

getAssonanceScore("babbling brook by blue grass", 0)

повертається 3.

Як зазначалось у коментарях, був би кращий, обчислювально ефективніший та більш стислий підхід

all_words <- unlist(strsplit(book, " "))
count <- sum(substr(head(all_words, -1), 1, 1) ==
substr(tail(all_words, -1), 1, 1))