アプリ版:「スタンプのみでお礼する」機能のリリースについて

Rの質問です。
x<-rnorm(n=100,mean=0,sd=1)
のとき
while文を使ってベクトルxの要素を一つ目から順番に足して、
5より大きい、または-5より小さい数になったときにループを抜けるプログラムを書きなさいという宿題がでました。

このxベクトルでwhileの条件を満たす確率はほとんど無いことは分かっていますが、とりあえずそこは置いといて。

それ以前にwhile文内のxベクトルの足し算がうまく行きません。
どうすればよいか教えていただきたいです。

(R触りたての初心者なので優しく教えていただければ幸いです。)

A 回答 (1件)

ます最初に言っておきます。


この宿題は「クソ」です。
少なくともこれ出題した先生を、もしスリッパ等を持参してるのなら、後頭部を不意打ちで叩く事を推奨します。
それくらいこの宿題は「クソ」ですね。
バッカじゃねーの、とか思いました。

まず前提として。

> xベクトルの足し算がうまく行きません。

根本的な問題として、ですね。
要素数がいくつのベクトルだろうと、要素の総和を取るのならsum関数を使えば良い話です。

> x <- rnorm(n=100, mean=0, sd=1)
> x
[1] 1.9856273882 -0.0393149350 1.0288693156 -0.3845112155 0.1567238100
[6] -0.7405260690 -1.3162452863 -1.9911837957 -0.3485634358 -0.0952636521
[11] 0.3321155828 1.0184437655 -0.5643891205 -0.9417264326 -0.3249899218
[16] -0.6664708526 -0.0690004397 -0.4059241836 -0.6461685678 0.3228851791
[21] 0.2975200321 -2.3220631940 0.2671440095 0.3863390253 -1.4282327200
[26] -0.6312963684 0.7327186886 -0.8350090262 -0.7726247015 -0.8878093032
[31] 0.4021283784 -1.6656350019 -0.4054765185 -0.8090603816 -0.2110006736
[36] -1.7352539949 1.6151750206 -0.8149158951 -0.0551857630 -0.6421213241
[41] -0.3388782470 0.0859075148 0.8474065923 -0.4084085973 0.6976830908
[46] 1.0474757803 2.1835703785 0.2234343153 -0.8321282959 1.1705157640
[51] 0.1406923858 0.5310833119 1.0286097907 -0.1113910680 -0.1782634035
[56] 0.2225236050 0.0880495148 -0.4833964174 -1.1139820839 0.6640903573
[61] 0.0004318528 -1.3910832642 0.3484243110 0.8836353448 -0.2069730566
[66] 0.9569187301 1.1368141213 -0.7794222966 -0.2522085370 -0.6094299759
[71] 1.4743915653 0.8597524122 -1.2086606269 0.7219514322 -0.0398310649
[76] -0.2778947725 1.2225708568 0.8540783930 -0.5201966225 0.6489344385
[81] -0.2339551798 -0.0436739979 0.6775265362 0.6719925284 -0.0120023720
[86] -0.5190897669 -0.6538468940 0.1239070298 1.5589439248 -0.7589570323
[91] -1.2458169161 0.5477068527 1.4340535191 -0.2366571431 0.1102293974
[96] -1.0281245484 -2.0588061250 0.7987346347 -2.0989746075 0.8238644449
> sum(x)
[1] -6.060421

これで終わり、です。
とすると、そもそもwhile文を使う必要がない。
そして、

> このxベクトルでwhileの条件を満たす確率はほとんど無いことは分かっています

なら、わざわざ条件を「満たさない」可能性でプログラムにバグを引き込む必要もないんですよ。
あまりに悪しき「発想」なんで、その先生、アタマがいかれてるんじゃないか、って思います。

言わば「C言語脳」ですね。
教えて!gooにも「しょーもない」C言語の問題が投稿されてる事が多いんですが、全く意図が分からない、生徒に無駄な苦労させる「為だけに」出題されてる宿題が多くて辟易とします。
大局的に、あるいは俯瞰的に「プログラミングの発想」を教えるより、C言語の構文の特殊性にだけ着目したくだらない問題。
この問題もそういう薫りがプンプンとしてます。
Rは構文的にC言語に似せていますが、実態は全く異なるモノです。むしろいかにベクトルを簡易に扱わせるか、が主題の言語なんです(これは配列を扱うのに苦労するC言語なんかとは全く違うわけで、じゃないと「統計用プログラミング言語」として意味が無くなるでしょう)。
結論として、whileやforなんかの「繰り返し構文」なんざ使わなければ使わない方が良いんです(その代わりに別の関数を用いるように設計されている)。

さて、じゃあその「C言語脳」が欲してる回答ってのはどういう感じなんでしょうか?
大体、こういう場合の「C言語脳」が欲しがる「みっともない」(C言語以外の現代的なプログラミング言語ユーザーなら全員「みっともなく」思う)解は次のようなモノになるでしょう。

i <- 0        # xのi番目を指定する
acc <- 0      # アキュムレータ(累積器)
while ((acc > 5) || (acc < -5)) {
 acc <- acc + x[i] # アキュムレータには常にxのi番目の要素を足していく
 i <- i+1      # iの値を1増やす
}

ちなみに、これ動かしても「条件が満たされれば終了する」だけで別に何も表示しません。
だって仕様(宿題)には何も書いてないから「何も出力しない」で充分です。
「C言語脳」の人たちなら上のプログラム見て「C言語的だ、美しい!」とか言うかもしれんですが、他の「現代的プログラミング言語ユーザー」なら「しょーもな」とか言うでしょうねぇ(笑)。
「特定のプログラミング言語の設計意図を無視した意図が分からん問題」からは「醜さ」しか生まれないモノですよ。
    • good
    • 0
この回答へのお礼

詳しい解説ありがとうございます!

sumを使った場合、最初から総数が出てしまうということは途中で条件を満たした場合は確認できるのでしょうか?

※蛇足(おそらく先生的にはwhile文の使い方が分かっているか知りたかっただけで問題をあまり深くは考えてないと思います…(汗)。)

お礼日時:2018/01/09 15:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!