¿Por qué R no evalúa esta línea?

R falla en evaluar en la línea 15. ¿Podría alguien decirme por qué falla? Este es un programa simple que genera todos los productos de números de longitud 3. Luego encuentra el mayor de estos que es un número palíndromo, por ejemplo, 9009.

largestpalndrome3 <- function(){
products3 <- c()
i <- 100
while(i <= 999){
    j <- i
    while(j <= 999){
        products3[i] <- i*j
        j <- j+1
    }
    i <- i+1
}
palindromes <- c()
i <- 1
for(prod in products3){
    if(prod<100000){
        prodcopy <- prod
        o <- prodcopy %% 10
        prodcopy = prodcopy%/%10
        t <- prodcopy %% 10
        prodcopy = prodcopy%/%10
        h <- prodcopy %% 10
        prodcopy = prodcopy%/%10
        th <- prodcopy %% 10
        prodcopy = prodcopy%/%10
        tth <- prodcopy %% 10
        hth <- prodcopy%/%10
        if(o==hth & t==tth & h==th){
            palindromes[i] <- prod
        }
    }
    if(prod>100000){
        prodcopy <- prod
        o <- prodcopy %% 10
        prodcopy = prodcopy%/%10
        t <- prodcopy %% 10
        prodcopy = prodcopy%/%10
        h <- prodcopy %% 10
        prodcopy = prodcopy%/%10
        prodcopy = prodcopy%/%10
        tth <- prodcopy %% 10
        prodcopy = prodcopy%/%10
        hth <- prodcopy%%10
        m <- prodcopy%/%10
        if(o==m & t==hth & h==tth){
            palindromes[i] <- prod
        }
    }
    i <- i + 1
}
}

preguntado el 01 de febrero de 12 a las 04:02

Realmente no hay ninguna razón para tener esto como función todavía. Es más fácil de depurar si no es una función. La forma en que configura los productos3 no está haciendo lo que espera que haga. -

ok, arreglé el bucle anidado, pero la evaluación en la línea 15 aún falla -

No está completamente arreglado: mira head(products3). -

Tus products3[i] <- tiene un montón de NA al principio porque tu i solo comienza en 100 (por lo que los primeros 99 valores son NA). Podrías hacerlo products3 <- products[100:length(products3)] después de tu bucle, o haz products3[i-99] <- i*j. -

Como i<-100, product3[1] is NA que no se puede comparar con 100000. 'o' es un nombre de variable terrible. Deberías incrementar -

2 Respuestas

Esto resolvería tu problema:

palindromes = function(n=3){

A1 = c((10^n-1):10^(n-1))
A2 = as.character(A1)


ltrs= sapply(A2,substring,1:n,1:n)
rownames(ltrs)=c(1:n)
ltrs=  ltrs[order(rownames(ltrs),decreasing=T),]
ltrs= apply(ltrs,2,paste,collapse='')


A2 = as.numeric(paste(A2,ltrs,sep=''))

A3= combn((10^n-1):10^(n-1),2)
A4 = A3[1,]*A3[2,]

largestpal = max(A2[ A2 %in% A4])

prod2= A3[,which(A4==largestpal)]

return(list('Number of Digits'=n, 'Largest Palindrome'=largestpal,'multiple of'=prod2))

}

Respondido 01 Feb 12, 09:02

La razón por la que recibe el error es que, en la forma en que ha definido product3, los primeros 99 elementos son NA.

Antes de usar un valor, debe realizar una verificación. Un simple paso es utilizar el is.na() comprobar.

Aquí hay un pequeño cambio que primero verifica si prod es NA y procede si no lo es. Esto le permitirá superar su error.

for(prod in products3){

        if(!is.na(prod)) {
            ...
            your code here
            ...
        }
    }

@AndresT le ofrece una forma diferente (y más eficiente) de hacer lo que está intentando.

Respondido 01 Feb 12, 10:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.