2017-03-12 4 views
1

誰かが私を助けてくれるかもしれませんが、私はここで何が問題なのか分かりません。私はちょうどR(数日前)を学び始めました。ここで私はMarsenne数を作成した後、すべてのMarsenneの素数を与える関数を構築しなければなりません。 1)factorlistは数値のすべての要素を見つける 2)マルセン数はマルセン数を生成する関数です 3)CheckForMersennePrimesは、確立されたメルセンヌ数が素数であるかどうかをチェックする関数です。 第2の機能は完璧に動作します: ***関数は、「プライム」0からのx「戻ってトップレベルにジャンプする機能がありません」

問題があるの区間内にあるすべての素数numersを与えます。しかし、3つ目はうまくいかず、以下のように間違いがあります。何が間違っているのか分かりません。私が何をしようとしたのは、メルセンヌがすべてプライムではないので、私はメルセンヌナンバーのセットを調べ、素数であるかどうかにかかわらず、その中のすべての要素をチェックしてから削除します。

誰かが、何が間違っているのを見つけるのに役立つことができますか?最後の関数へ

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 

答えて

2

CheckForMersennePrimesvec<-MarsenneNumber(x){if()...}

ように私はそれらの余分なブレースを除去し、ライン2と、この関数の線4(ループの内側)に余分{}を有しています。私が思う

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

は、あなたの意図は、あなたがforループの外vecを開始し、この条件をチェックする必要があり、これが本当であればfactorlist(vec[i])が1に等しくなるvecの値を取得することです。そして最後に、ifの条件を満たすすべてのvec値を含むa1を返します。

また、変数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) 
} 
+0

のインデックスは、ありがとうございます。しかし、if(factorlist(vec [i])!= 1){"これらは両方ともコード内の同じ"レベル "にあるので、関数は私の新しい変数" vec "を" if(factorlist(vec [i])!新しい変数を導入して後で使用したい場合、{}を使用する必要があると私は考えていました。たぶん私は何かを誤解します。また、私はまだ同じ問題に直面しています。 – ike

+0

エラー:戻る機能はありません。トップレベルにジャンプ >} エラー:予期せぬ「}」の「}」がこの問題に直面しています。 – ike

+0

サンプルと 'primes'関数を追加して質問を更新しました。私は基本的なRスタジオを使用し、何もそれを変更していないし、それに何もダウンロードしていない。 – ike

関連する問題