[[ノート/ノート]]~
[[ノート/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);