[[ノート/ノート]]~
[[ノート/R]]      [[ノート/R/Rを使ってみる]]~
訪問者数 &counter();      最終更新 &lastmod();

**もう少し探検する (2010-03-03) [#q6be0f2e]

***プログラムの内部でインタラクティブに仕事がしたい [#w9f88887]
計算のパラメタを少しずつ変えながら、グラフを描きたい。~
でも、関数を毎度呼び出すのも面倒。

 # Test terminal input
 u <- array(c(1,2,3,4,5,6),c(3,2))

 
 while (({cat("終了(q), 印刷(p), データ編集(e)⇒"); c = readline(prompt="")}) != "q") {
 #
   if (c == 'e') { # Edit
     u2 = edit(u)  # Edit data frame
     print(u2)
     while (({cat("  セーブ(s), 印刷(p), 廃棄(q)⇒"); c2 = readline(prompt="")}) != 'q') {
       if (c2 == 's') {
         u = u2
         break
       } else if (c2 == 'p') {
         print(u2)
       }
     }
   } else if (c == 'p') {
     print(u)
   }
 }
 cat("終了\n")

いくつかのポイント
-ループは、for文のほかに、whileも書ける。~
for文はたとえば for(i in 1:max) { … } ~
while文はたとえば while (x < 3) { … }
-入力を促すメッセージ「終了(q), 印刷(p), データ編集(e)⇒」を出力するのに、~
print()だと、行頭に[1] とかが付くが、
 [1] "終了(q), 印刷(p), データ編集(e)⇒"
cat()だと、何も付かない。その代わり行末の改行をしないので、必要なら自分で"\n"を入れる。今回は敢えて入れないで、入力促進メッセージと同じ行に、入力をいれさせることにした。
 終了(q), 印刷(p), データ編集(e)⇒   &color(red){q};
-入力のためのコマンドは、scanだといくつかパラメタが要るが、
 c = scan(what="character",nmax=1,quiet=TRUE)
結局readlineでもうまくできる。
 c = readline(prompt="")
-入力で入ってきた文字(c)は、c != 'q' のような比較をしてよい。
-whileで判断に使う「値」は、カッコ内に書いた「文」(Rでは「式(expression)」と呼んでいる)を評価した値である。代入文(代入式)を書くと代入値が文の値になる。~
さらにここでは、2つの文をセミコロンでつないで中括弧("{…}")で括った複合文(複合式、compound expression)を書いて、その値をwhileの判断の値に使うようにした。第1文はプロンプトを表示する文で、第2文はreadlineである。これによって、whileの頭で≪プロンプトを書いた後に入力≫を行い、その入力値によってループ脱出を判定する、という仕組を作った。もしこの2つの文をcompoundにつながないと、たとえばプロンプト表示が2箇所(ループに入る前とループの最後)に必要になったりするので、調子が悪い。
-入力文字は、whileで判定に使うと同時に、変数cに代入される。その後、if (c=='p') 文で条件分岐している。読み込んだ値cは文字だとみなしている。
-edit()については、次の項で触れる。

数値をインタラクティブに入力すると
 x = readline(prompt="")
 s = 0
 for (i in 1:x) {
   s = s + i
   cat(paste(s,'\n'))
 }
この場合、読んだ値xは文字から自動的に数値に変換されている。

***arrayを編集させる [#qb1a5ae9]
端末上で変数の内容を編集させるには、edit関数が使える。
-スカラ量のときは、edit(x)とすると(適当な)エディタが開く。editの戻り値をその変数xに書き戻すと(つまりx = edit(x))、エディタを終了するとそのときの値が変数xに書かれる。
-なお、同じことは、関数fix()を使ってもできる。fix(x)でよい。
-arrayのときでもそのまんまedit(u)とすれば、表の編集画面が開いて編集できる。値を戻すのはスカラ量と同じに u = edit(u) とする。
&ref(array_editor.JPG);

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS