4

ユーザーに「2012」または「2013」と入力するように要求するコードを作成しました。次にwhile、ユーザーが 2012 または 2013 を入力したかどうかを確認するループ チェックを行います。

有効な年を入力する要求は、ユーザーが有効な数字を入力するまで続くはずです。ただし、予期しない「{」が発生するというエラーが発生し続けます。コードでこのようなエラーが発生する理由がわかりません。

コードは次のとおりです。

yr_function <-function(){
   year_of_data <- as.numeric(readline("Is the year of concern 2012 or 2013? >>> "))
}

year_of_data = 0
While((year_of_data != 2012) | (year_of_data != 2013)){
    yr_function
if(year_of_data != (2012 | 2013),print("You must type either 2012 or 2013")
}

生成されたエラーがあります:

Error: unexpected '{' in "While((year_of_data != 2012) | (year_of_data != 2013)){"

どんな助けでも大歓迎です。

4

1 に答える 1

14

ここで一般的なアイデアの骨子ができましたが、単純なミスによっていくつかの場所でつまずきました。あなたが説明したように機能する注釈付きバージョンを次に示します。

yr_function <-function(){
   res <- as.numeric(readline("Is the year of concern 2012 or 2013? >>> "))
   if (is.na(res)){
    res <- -1
   }
   res
}

最初の問題の 1 つはスコープに関するものでした。この関数内とループyear_of_dataの直前の両方で定義しました。ただし、関数内で作成された変数は、ループwhile前の変数を参照しません。whileそれらは別々の環境に存在します。そのため、この関数を変更して、代わりにユーザーが入力した値を返すようにしました。

大きなトピックである検証についてはあまり議論しませんでした。ここで、ごくわずかな検証を追加しました。基本的に、ユーザーが合理的に数値に強制できないものを入力すると、NA 値が返されますが、これは今後の頭痛の種になります。そのため、単純にそれを確認し、その場合は -1 を返します。これは、検証の問題に対する完全な解決策ではありません。

year_of_data <- 0
while((year_of_data != 2012) & (year_of_data != 2013)){
    year_of_data <- yr_function()
    if (!year_of_data %in% c(2012,2013)){
        print("You must type either 2012 or 2013")
    }else{
        break
    }
}

これが固定whileループです。最初に、いくつかの単純な構文エラーを修正しました (そうでwhileはないWhileなど)。yr_function()次に、 toの結果を代入して、結果のyear_of_data値を確認し、それに応じて行動できるようにしました。

if条件 ( )での試みyear_of_data != (2012 | 2013)は構文的に正しくなかったため、値が vector に含まれているかどうかを確認することに切り替えましたc(2012,2013)

最後にif、コンマと print ステートメントを続けました。コンマは別の構文エラーです。printそこで、ステートメントを中かっこで囲み、ユーザーが何か正しいことを入力した場合にループelseから抜け出す句を追加しました。while

menuより一般的には、この種のタスクの関数を調査したい場合があります。おそらく、検証の問題を処理するのが少し簡単になります。

于 2013-04-12T03:13:00.090 に答える