36. 落穂ひろい


連番の変数を作成する

他のプログラム言語(例:C 言語)に用意されている配列は x[1],x[2],・・・ という形をしている.R でも関数 assign() と関数 paste() を組み合わせることで,他のプログラム言語の配列と似たような変数名を付ける事が出来る.

 
 for (i in 1:5) assign(paste("A", i, sep=""), i)     # 変数 Ai に i を代入
 A5

[1] 5

数値ベクトルの対話的入力:readline()

関数 readline() を用いると,キー入力があるまでプログラムの実行を停止することが出来る.これにより対話的な入力を行うことが出来る(以下の関数は『RjpWiki』の記事より引用した).キー入力があるまでプログラムの実行を停止するのではなく,秒数を指定してプログラムを停止する場合は関数 Sys.sleep(time) を用いればよい.

 
 mytest <- function() {
   ANS <- readline("1+2? ")
   if (ANS == "3") cat("Correct!\n")
   else            cat("Wrong...\n")
 }
 mytest()

1+2? 3              # 入力待ち状態になるので,3 と入力
Correct!

 mymessage <- function() {
   Sys.sleep(3)
   cat("Hello.\n")
 }
 mymessage()

Hello.

readline() を用いることで数値ベクトルを読み込ませるようにすることも出来る.手順は,まず対話的に文字列を入力(任意の分離記号が指定可)させ,次に関数 strsplit() で文字列リストに変換してから関数 unlist() で文字列ベクトル化し,最後に関数 as.numeric() で数値化する.

ここで "," で区切ったベクトルを入力することが出来る関数 myfunc() を以下に定義してみる.

 
 myfunc <- function () {
   Str <- readline("Enter : ")
   as.numeric(unlist(strsplit(Str, ",")))
 }
 x <- myfunc()

Enter : 1,2,3,4,5   # 入力待ち状態になるので,1,2,3,4,5 と入力

 x                    # x の値を確認

[1] 1 2 3 4 5

また,オブジェクト名を入力して読み込ませる場合は以下のようにする.

 
 x <- 1:5
 y <- get(readline())
 x                    # 入力待ち状態になるので,x と入力
 y                    # y の値を確認

[1]  1  2  3  4  5

メニューによる選択:menu()

関数 menu() でメニュー選択を実現できる.引数 choices で選択肢を示す文字列ベクトル,引数 title でメニューのタイトルとして出力される文字列を指定する.0, 1, 2, ...を選択することが出来,0 を入力したらメニュー選択から抜けることが出来る.以下では選択肢番号により switch 文で実行内容を変えている.

 
 switch(menu(c("1+2", "3*4"), title="0: exit") + 1, cat("Nothing done\n"), 3, 12)

0: exit 
1: 1+2
2: 3*4
選択:1
[1] 3