“没有功能可以返回,跳到顶层”

时间:2017-03-12 02:29:51

标签: r

有人可以帮助我,我不明白这里有什么问题。我刚刚开始学习R(几天前)。在这里,我必须构建一个函数,在创建Marsenne数字后,它将为我提供所有Marsenne素数。我创建了3个函数: 1)factorlist只是找到一个数字的所有因子 2)Marsenne数是一个创建Marsenne数的函数 3)CheckForMersennePrimes是一个检查已建立的Mersenne数是否为素数的函数。 ***函数“primes”给出了从0到x

的所有主要数字

问题是: 前2个功能完美运行。但第三个不起作用,并给出以下错误。我无法理解什么是错的。我试图做的是因为Mersenne数字不是全部素数,我会查看MersenneNumber的集合并检查其中的每个元素是否为素数然后将其删除。

有人可以帮助找到错误吗?

以下是我的功能:

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

primes <- function(n){
  primesR <- function(p, i = 1){
    f <- p %% p[i] == 0 & p != p[i]
    if (any(f)){
      p <- primesR(p[!f], i+1)
    }
    p
  }
  primesR(2:n)
}

MarsenneNumber<-function(x){
  vec<-c(0)
  for (i in 3:x){
    vec<-union(vec, c(2^primes(i)-1))
  }
  return(vec[-length(1)])
}

CheckForMersennePrimes<-function(x){
  b<-length(MarsenneNumber(x)){
    for (i in 1:b){
      vec<-MarsenneNumber(x){
        if (factorlist(vec[i])!=1){
          vec<-c(-vec[i])
        }
      }
    }
  }
  return(vec)
}

我错过了最后的功能:

Error: unexpected '}' in "      }"
>     }
Error: unexpected '}' in "    }"
>   }
Error: unexpected '}' in "  }"
>   return(vec)
Error: no function to return from, jumping to top level
> }
Error: unexpected '}' in "}"  

以下是此功能的工作原理示例。

> factorlist(20)
[1]  1  2  4  5 10

> primes(20)
[1]  2  3  5  7 11 13 17 19

> MarsenneNumber(20)
[1]      3      7     31    127   2047   8191 131071 524287

1 个答案:

答案 0 :(得分:3)

CheckForMersennePrimes在此功能的第2行和第4行(for循环内)中有额外的{},例如vec<-MarsenneNumber(x){if()...}

我删除了那些额外的括号。

CheckForMersennePrimes <- function( x ){
  b <- length( MarsenneNumber( x ) )
  for ( i in 1:b ){
    vec <- MarsenneNumber( x )
    if ( factorlist( vec[i] ) != 1 ){
      vec <- c( -vec[i] )
    }
  }
  return( vec )
}

我认为,您的目的是获取vec等于factorlist(vec[i])的值。如果这是真的,那么您必须在for循环之外启动vec检查这个条件。然后最后返回包含通过a1条件的所有vec值的if

我还删除了b变量,从而缩短了代码。你不需要它。相反,你可以做seq_along(vec)。没有b变量,它会做同样的事情。

CheckForMersennePrimes <- function( x ){
  vec <- MarsenneNumber( x )
  a1 <- c()
  for ( i in seq_along( vec ) ){
    if ( factorlist( vec[i] ) == 1 ){
      a1 <- c( a1, vec[i ] )
    }
  }
  return( a1 )
}

进一步压缩代码将提供相同的输出。我删除了seq_along并将vec

编入索引
CheckForMersennePrimes <- function( x ){
  vec <- MarsenneNumber( x )
  a1 <- c()
  for ( i in vec ){
    if ( factorlist( i ) == 1 ) {
      a1 <- c( a1, i )
    }
  }
  return( a1 )
}