/ / Erro ao executar uma instrução if em R - r, processamento de texto

Erro ao executar uma instrução if em R - r, processamento de texto

Eu tenho essa pequena função para obter uma pontuação de Assonance para o texto

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)
}

O que isso faz é obter uma lista com uma linhade texto em sua primeira posição e uma segunda linha de texto em sua segunda posição e assim por diante. Depois de obter essa linha, ela divide a frase e a coloca em uma lista contendo todas as palavras constituintes. O que eu faço com isso é que eu comparo a primeira letra da primeira palavra com a primeira letra da segunda palavra, e a primeira letra da segunda palavra com a primeira letra da terceira para obter uma pontuação total de assonância. Isso é dividido pelo tamanho do livro. Quando tento testar esta função com uma pequena lista de entrada "word" do formulário:

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

Isso me dá esse erro:

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

Eu estou trabalhando no RStudio, e muito iniciante no R, qualquer ajuda seria muito apreciada. Obrigado!

EDIT: Deve ser getAlliterationScore em vez de getAssonanceScore: D

Respostas:

3 para resposta № 1

for j in length(words[[1]]) não faz o que você espera; j é sempre igual ao tamanho total da lista. Isso também significa que j + 1 sai do final da lista (de modo que words[[1]][j + 1] retorna NA).

Mude o seu for linha de loop para

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

Agora

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

retorna 3.

Como observado nos comentários, uma abordagem melhor, computacionalmente mais eficiente e mais concisa seria

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