初級Q&Aで講義でのデモ用の工夫を質問(2012-04-15)したものですが,他の方にも参考になると思い,以下にメモしておきます.こうしたデモは,聴衆の理解度や講義内容により,当然ふさわしいやり方が変わってきますが,私の場合,Rの全くの初心者に,パソコンにつないだプロジェクターからスクリーンに実行画面を投影しながら,使い方を学ばせる,という状況を考えています.というわけで,(1) 学生の気が散らないよう画面にはR端末以外の余計なものをできるだけ出さない(学生は結構関係ない部分に気を取られがちです),(2) 操作はできるだけ簡単にしたい(教師たるもの学生に背を向けっぱなしやPCばかり見ているのはNGです),(3) 編集の手間を避けるため,ソースファイル以外は使いたくない(一学期分の内容を作るのは結構大変です),(4) 可能な限り実際の実行過程に近づける(特に実行結果を予め見せない),が希望でした.
以下の方法は,初級Q&Aへの質問に対し匿名氏から教えていただいた(感謝!)方法を少し弄ったもので,ほぼ私の希望を満たしています.この方法はアドオンパッケージ evaluate にある関数 evaluate と replay 関数を使い,ソースファイルを予め命令単位に解釈実行した結果をリストにまとめ,それを改めて擬似的に実行しているように見せかけています.したがって擬似実行中に作られたオブジェクトは保存されません.当然,途中でアドリブ的に追加実行は出来ません.元に戻ることも出来ませんが,端末がスクロールを許せば見かけ上元に戻すことはできます.コメント及びコメント行もそのまま表示されます.
使い方は,Rのソースファイルを abc.R とすると
Demo("abc.R")
を実行し,あとはキャリッジ・リターンを押すだけで,次々命令(複数行命令可)とその結果が表示されていきます.作図結果も擬似実行表示されます.コメントとコメント行も表示されます.
Demo2 関数は Demo 関数ではステップごとに必ず入る空白行を表示させないバージョンですが,作図関数等ではやはり余分な空白行が入ります(この点を含めまだ改良の余地).
最初の評価実行の段階は,結構時間がかかる場合があります.その時は,予め評価実行結果を別個に作っておくことが考えられます.こうすれば,講義時間内では終了しないようなコードのデモも簡単になります.
abc.demo <- DemoAux("abc.R") # 評価実行結果リストを先ず作る Demo0(abc.demo) # もしくは Demo20(abc.demo)
デモ用の工夫としては他にも初級Q&Aで挙げられた, (1) 実行ログファイルを編集した結果をエディターでスクロールしながら見せる (当然作図結果は見せられない), (2) Rと連動したエディタからソースファイルを命令単位に実行する, (3) debug 機能の利用, 等が考えられます.R のアドオン・パッケージを探しましたが,適当なものは見つけられませんでした.これ以外にも,何か良い工夫があれば是非教えてください.
以下が,私が使うことにしたデモ用関数(ページ下にソースファイルを添付しました)です.
# ソースファイルを擬似的に実行するデモ用の関数 # キャリッジリターンを押すたびに一命令ずつ実行し,結果を表示する # 作図結果もその都度表示できる Demo <- function(x){ require(evaluate) xx <- evaluate(file(x)) tmp <- function(y){replay(y);invisible(readline())} invisible(lapply(xx, tmp)) }
# ソースファイルを擬似的に実行するデモ用の関数 # キャリッジリターンを押すたびに一命令ずつ実行する # 一部の命令(作図命令等)を除き,Demo 関数で毎回入る空白行が無い # (解釈実行結果に入る改行文字を取り除いています # 副作用でプロンプト部分が消えてしまうので,補っています) Demo2 <- function(x){ require(evaluate) xx <- evaluate(file(x)) tmp <- function(y){ yy <- y z <- substr(yy,1,nchar(yy)-1) if(class(yy)[1] == "source") yy <- paste("> ", z, sep="") else if(class(yy)[1] == "character") yy <- z replay(yy) invisible(readline())} invisible(lapply(xx, tmp)) }
# 最初にソースファイルを評価した結果をリストに変換する関数 # ソースファイルの評価に時間がかかる場合,先に評価結果を得ておく # 講義時間内では終わらないような時間のかかるデモも可能 DemoAux <- function (x) {require(evaluate); evaluate(file(x))}
# Demo(x) は Demo0(DemoAux(x)) と同じ Demo0 <- function(x){ require(evaluate) tmp <- function(y){replay(y);invisible(readline())} invisible(lapply(x, tmp)) }
# Demo2(x) は Demo20(DemoAux(x)) と同じ Demo20 <- function(x) { require(evaluate) tmp <- function(y){ yy <- y z <- substr(yy,1,nchar(yy)-1) if(class(yy)[1] == "source") yy <- paste("> ", z, sep="") else if(class(yy)[1] == "character") yy <- z replay(yy) invisible(readline())} invisible(lapply(x, tmp)) }
以下が実行結果の見本です.
> Demo("L1.R") > ### R のデータタイプ > x <-1 # 数値(倍精度実数) > x [1] 1 > (x <- 1) # 付値と結果の表示を同時に行う [1] 1
> Demo2("L1.R") > ### R のデータタイプ > x <-1 # 数値(倍精度実数) > x [1] 1 > (x <- 1) # 付値と結果の表示を同時に行う [1] 1