2012-02-01 2 views
1

R не может оценить строку 15. Может ли кто-нибудь сказать мне, почему это не удается? Это простая программа, которая делает все продукты чисел длины 3. Затем находит самый большой из них, что это число палиндром, например, 9009.Почему R не может оценить эту строку?

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 
} 
} 
+0

На самом деле нет никаких причин, чтобы иметь это как функцию. Легче отлаживать, если это не функция. То, как вы настраиваете продукты3, не делает то, что вы надеетесь, что это делает. – Dason

+0

ok Я исправил вложенный цикл, но eval в строке 15 все еще не удалось –

+1

Это не полностью исправлено: посмотрите на 'head (products3)'. –

ответ

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

} 
2

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

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

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

for(prod in products3){ 

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

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

Смежные вопросы