为什么R无法评估这条线?

时间:2012-02-01 04:37:54

标签: r

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 个答案:

答案 0 :(得分:3)

这可以解决您的问题:

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

}

答案 1 :(得分:2)

您收到错误的原因在于您定义 product3 的方式,其前99个元素为NA

在使用值之前,您必须执行检查。一个简单的步骤是使用is.na()检查。

这是一个小的变化,首先检查是否为NA ,如果不是,则继续进行。这会让你超越错误。

for(prod in products3){

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

@AndresT为您提供了一种不同(且更有效)的方式来完成您的尝试。