Почему R не может оценить эту строку? - PullRequest
1 голос
/ 01 февраля 2012

R не удается оценить в строке 15. Может ли кто-нибудь сказать мне, почему это не удается? Это простая программа, которая делает все произведения чисел длины 3. Затем находит наибольшее из них, которое является числом палиндрома, например, 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
}
}

Ответы [ 2 ]

3 голосов
/ 01 февраля 2012

Это решит вашу проблему:

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

}
2 голосов
/ 01 февраля 2012

Причина, по которой вы получаете сообщение об ошибке, заключается в том, что, как вы определили product3 , первые 99 его элементов - NA.

Перед использованием значения необходимо выполнить проверку.Одним простым шагом является использование проверки is.na().

Вот небольшое изменение, которое сначала проверяет , является ли prod NA и продолжается, если это не так.Это избавит вас от вашей ошибки.

for(prod in products3){

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

@ AndresT дает вам другой (и более эффективный) способ сделать то, что вы пытаетесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...