1. ホーム
  2. r

[解決済み] "戻るべき機能がなく、トップレベルへジャンプ"

2022-01-26 03:41:07

質問

何が問題なのか理解できないので、どなたか助けてください。私はRを学び始めたばかりです(数日前)。私はMarsenne数を作成した後、すべてのMarsenne素数を与える関数を構築する必要があります。私が作成した関数は3つあります。 1) factorlist 単純にある数のすべての因子を求める関数です。 2) マルセンヌ数とは、マルセンヌ数を作成する関数です。 3) CheckForMersennePrimes は、創設されたメルセンヌ数が素数かどうかをチェックする関数です。 ***関数 "primes"は、0からxまでの区間にあるすべての素数を与える。

問題は 最初の2つの関数は完全に動作する。しかし、3番目の関数は動作せず、以下のようなエラーが発生します。何が間違っているのか全く理解できません。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

解決方法は?

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]) は1に等しい。 もしこれが真実なら、あなたは vec をforループの外側で実行し、この条件を確認します。そして最後に 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 )
}