/ / Error al ejecutar una instrucción if en R - r, procesamiento de texto

Error al ejecutar una sentencia if en R - r, procesamiento de texto

Tengo esta pequeña función para obtener un puntaje de asonancia para el 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)
}

Lo que hace es que obtiene una lista con una líneade texto en su primera posición y una segunda línea de texto en su segunda posición y así sucesivamente. Después de obtener esta línea, divide la oración y la coloca en una lista que contiene todas las palabras constitutivas. Lo que hago con eso es que comparo la primera letra de la primera palabra con la primera letra de la segunda palabra, y la primera letra de la segunda palabra con la primera letra de la tercera para obtener un puntaje de asonancia total. Esto se divide por la longitud del libro. Cuando intento probar esta función con una pequeña lista de entrada "palabra" del formulario:

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

me da este error

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

Estoy trabajando en RStudio, y muy principiante en R, cualquier ayuda sería muy apreciada. ¡Gracias!

EDITAR: debe ser getAlliterationScore en lugar de getAssonanceScore: D

Respuestas

3 para la respuesta № 1

for j in length(words[[1]]) no hace lo que espera que haga; j solo es igual a la longitud total de la lista. Esto también significa que j + 1 se ejecuta al final de la lista (para que words[[1]][j + 1] devoluciones NA)

Cambia tu for línea de bucle a

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

Ahora

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

devuelve 3.

Como se señaló en los comentarios, un enfoque mejor, computacionalmente más eficiente y más conciso sería

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