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


添付ファイル: fileDemo.R 788件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-03-25 (土) 11:19:17