Напишите на R функцию для поиска совершенных чисел

Я новичок в R и пытаюсь ответить на следующий вопрос:

Создайте в R функцию, которая принимает на вход натуральное число N и возвращает на выходе список всех совершенных чисел от 1 до N.

Здесь 3 шага: 1. Проверить список множителей 2. Проверить, является ли число совершенным 3. Проверить от 1 до 10000

factorlist<-function(n){
if(n<2){return("Invalid Input")}
if(n%%1!=0){return("Invalid Input")}
vec<-0
for(i in 1:(n-1)){
if(n%%i==0){
vec[length(vec)]<-i
vec<-c(vec,0)
}
}
vec<-vec[-length(vec)]
return(vec)
}

perfectcheck<-function(n){
if(n-sum(factorlist(n)) ==0) {return("Perfect Number")}
else{return("Not Perfect Number")}
}



perfectcheckN<-function(N){
for(i in 1:N){
if(perfectcheck(i)=="Perfect Number"){
vec[length(vec)]<-i
vec<-c(vec)
}
}
vec<-vec[-length(vec)]
return(vec)
}

и я получил следующую ошибку для моего третьего шага

Error in sum(factorlist(n)) : invalid 'type' (character) of argument

Я потратил несколько часов и до сих пор не мог понять свою ошибку, пожалуйста, помогите. Спасибо!


person Christopher Yau    schedule 10.03.2017    source источник


Ответы (1)


Вывод factorlist(i) является символом, когда i==1.

В вашем коде много циклов и ifs. Вы можете просто сделать

facs <- function (x) {
    x   <- as.integer(x)
    div <- seq_len(abs(x) - 1L)
    div[x%%div == 0L]
}


perfectcheckN <- function(N){
    out <- 1:N
    out[sapply(out, function(x) x == sum(facs(x)))]
}
person Ryan    schedule 10.03.2017