[[RjpWiki]]

初級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

#comment

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