狠狠撸

狠狠撸Share a Scribd company logo
搁が苦手な人に使って顶く
              ~RコマンダーとRookと私~



        2012/03/10
        Tokyo.R #21
          和田 計也
サイバー系
サイバー系


     はじめに



     ※この発表は個人の
     見解であり、所属す
     る組織の公式見解で
     はありません。

2012/03/10               1
サイバー系


     自己紹介

 ? 和田 計也(@wdkz)
        ? 静岡県袋井市出身



 ? サイバー系企業でデータマイニングエンジニア職
        ? 創立記念日が3月18日
        ? 社長の出身地が福井県鯖江市



 ? 前職はバイオベンチャー
        ? バイオマーカ探索してた
        ? 学生時代は枯草菌の研究




2012/03/10                          2
サイバー系


     アメーバピグで遊んでみた




                    http://pigg.ameba.jp
2012/03/10                                 3
サイバー系


     作ってみた
   ?         holiday()関数




2012/03/10                         4
サイバー系


     問題提起

 ? Rはいろんなことができて素晴らしいですよ!
       ? 休日もわかるよ!バースデー問題も秒殺!
       ? でも、「いいから使ってみて下さい」って言ってもな
         かなか使ってくれないよね
       ? コマンド?何それ?
 ?問題点
        ?GUIがない
        ?マウスでポチっとな~ができない
 ?解決策
        ?Rコマンダー
        ?Webアプリで作っちゃう

2012/03/10                              5
サイバー系


     Rコマンダー

? Rコマンダーとは?
      ?      RのGUIの一つ
             ?   R StudioとかRattleとか,,



? 利点
      ?      マウス使える


? インストール
      ?      install.packages(“Rcmdr”)



? 起動
      ?      require(Rcmdr)




2012/03/10                                       6
サイバー系


     Rコマンダー使用例

     ? λ=3のポアソン分布ってどんな確率分布だったけ?



                 ①
                     ③


             ②




2012/03/10                                7
サイバー系


     Rコマンダーの圧倒的な利点

     ? カスタマイズできる!!




2012/03/10                   8
サイバー系


     Rコマンダーの圧倒的な利点

     ? 先ほどのholiday()関数を使ってもらう


                          ①
              ②


               ③




2012/03/10                              9
サイバー系


     Rコマンダーのカスタマイズ方法

  ? メニューバーにメニューを追加
         ? Rcmdrインストールフォルダ→etc→Rcmdr-menus.txt
             (C:?Users?wada_kazuya?Documents?R?win-library?2.14?Rcmdr)




        ★このテキストファイルをエディタで編集する
2012/03/10                                                                   10
サイバー系


     Rコマンダーのカスタマイズ方法

  ? Rcmdr-menus.txtに以下を追加
   ? Toolsメニューの下あたり(私の例では351行目の下)

     menu antibayMenu topMenu ""       ""           "" ""
     item antibayMenu command "休日チェキラ" tcl.holiday  "" ""
     item topMenu     cascade "あんちべ!"   antibayMenu "" ""



      3行目:トップメニューに「あんちべ!」文字列を追加してそれをantibayMeruと命名
      1行目:antibayMenuをトップメニューに追加
      2行目:antibayMenuに「休日チェキラ」という子メニューを追加して、
          それがクリックされたときにtcl.holiday関数が呼ばれるようにする




        ★勘のいい皆様ならなんとなくわかるでしょう
2012/03/10                                                      11
サイバー系


     Rコマンダーのカスタマイズ方法

  ? ユーザ入力部分のUI(ダイアログ)は適当に作る
   tcl.holiday <-function(){
    initializeDialog(title="休日チェキラ") #ダイアログのタイトル
    Var1 <- tclVar(substring(Sys.Date(),1,4)) #テキストボックスの初期値
    Var1Entry <- tkentry(top, width=“20”, textvariable=Var1)
    onOK <- function(){ #OKボタン押した時の挙動
      closeDialog() #閉じて
      XXX <- as.character(tclvalue(Var1)) #入力値を取得して
      command <- paste(“holiday(‘”, XXX, “’)”, sep=“”) #holiday関数呼ぶ
      doItAndPrint(command) #コマンド実行                    #文字列生成
      tkfocus(CommanderWindow()) #フォーカスを親に戻す
    }
    OKCancelHelp(helpSubject="+")
    tkgrid(tklabel(top, text=gettextRcmdr(“いつ?”)), Var1Entry,
   sticky=“e”) #テキストボックスの横のテキスト
    tkgrid(buttonsFrame, columnspan=2, sticky=“w”) #ボタン設置
    tkgrid.configure(Var1Entry, sticky="w") #?
   }


2012/03/10                                                            12
サイバー系


     Rコマンダーのカスタマイズ方法

  ? R-cmdr-menus.txtと同様に、関数定義ファイルもetcフ
    ァイルに突っ込んでおく
         ? Rcmdrインストールフォルダ→etc
             (C:?Users?wada_kazuya?Documents?R?win-library?2.14?Rcmdr)




        ★etcフォルダに突っ込んでおけば、Rcmdr起動時に勝手にロードしてくれる
2012/03/10                                                                   13
サイバー系


     Rコマンダーのその他

  ? Rコマンダーの注意点
         ? Rcmdrのアップデートをしてしまうと、etcフォルダ内のフ
           ァイルが初期化(消去)されてしまうので努力が水の泡に


  ? Rコマンダーのカスタマイズ?他の方法
         ? Rのパッケージ作るようにコンパイル済みのものを作ること
           も可能。zipファイルを配布してRコマンダーからアドオンイ
           ンポートしてカスタマイズ化できるからユーザにとってはこ
           ちらのほうが嬉しい。
         ? 参考文献
             http://www.okada.jp.org/RWiki/?RcmdrPlugin%C4%B6%C6%FE%CC%E7
             http://cwoweb2.bai.ne.jp/~jgb11101/files/R-commander.pdf




2012/03/10                                                                      14
つぎ




2012/03/10   15
サイバー系


     Webアプリ作っちゃう

  ? Rook使う
         ? Rは(おバカな)webサーバを内蔵しているんです!
         ? Hello World的なのやってみよう
             install.packages("Rook")
             require(Rook)
             s <- Rhttpd$new()
             s$start(quiet=TRUE)
             s$browse(1)




        ★webブラウザが起動して何やらそれっぽい雰囲気に
2012/03/10                                  16
サイバー系


     Webアプリ作った

  ? Rookで作った     source(“Rook.holiday.R”)
                 holiday.start()




        ★できた
2012/03/10                                      17
サイバー系


     RookでのWebアプリ作成方法?1

  ? ユーザ入力部分のUI(htmlのフォーム)は適当に作る
  Rook.holiday <- function(env) {
    source("holiday.R")
    req = Rook::Request$new(env)
    res = Rook::Response$new()
    res$write('いつ?:?n')
    res$write('<form method="POST">?n')
    res$write('<input type="text" name="xdim" value="2012">?n')
    res$write('<input type="submit" name="Go", value="holiday">?n</form>?n<br>')
  #まだまだ続く




             入力formはhtmlで力業で書く




2012/03/10                                                                         18
サイバー系


     RookでのWebアプリ作成方法?2

  ? ユーザ入力部分のUI(htmlのフォーム)は適当に作る?続き
  #Rook.holiday関数の続き
    if (!is.null(req$POST())) {
             y <- req$POST()[["xdim"]] #テキストフォームの入力値を取得
             holidays <- holiday(y)        #holiday関数の結果を取得
             res$write("<p>")
             if(length(holidays)==1){
                        res$write(as.character(holidays))
                        }else if(is.matrix(holidays)){
                        for(i in 1:nrow(holidays)){
                           res$write(paste(as.character(holidays[i,1]), "<br>?n", sep=""))
                        }
                        }else{
                        for(i in 1:nrow(holidays)){
                            res$write(paste(as.character(holidays[i,1]), " | ",
                                              as.character(holidays[i,2]), "<br>",sep=""))
                        }
             }
             res$write("</p>")
    }
    res$finish()
  }


                                                  結果もhtmlで力業で書く
2012/03/10                                                                                   19
サイバー系


     RookでのWebアプリ作成方法?3

  ? Webサーバ起動部分
  holiday.start <- function(){
            s <<- Rhttpd$new() #グローバル領域に変数を作成
             #前ページで定義したRook.holiday関数にholidayと名付けて
            s$add(app = Rook.holiday, name = “holiday”)
            s$start()
            s$browse(“holiday”) #Rook.holiday関数を呼び出す
  }




2012/03/10                                                    20
サイバー系


     デモ




2012/03/10       21
サイバー系


     最後に

   ? CUI嫌いな人にRを使ってもらうには...              (使いこなすわけではない)
             ? Rコマンダーを使って、GUIを用意してやる
             ? Rookを使って、Webアプリ作って提供する


   ? ただし注意も必要
             ? Rコマンダーカスタマイズを複数ユーザに設定するのはちょっと面
               倒。しかも、Rcmdrアップデートするといろいろ消える
             ? Rookで実運用は(たぶん)できないのでrApacheとか使うといいか
               も




2012/03/10                                              22

More Related Content

搁が苦手な人にも搁を使って顶くために词搁肠辞尘尘补苍诲别谤と搁辞辞办词

  • 1. 搁が苦手な人に使って顶く ~RコマンダーとRookと私~ 2012/03/10 Tokyo.R #21 和田 計也 サイバー系
  • 2. サイバー系 はじめに ※この発表は個人の 見解であり、所属す る組織の公式見解で はありません。 2012/03/10 1
  • 3. サイバー系 自己紹介 ? 和田 計也(@wdkz) ? 静岡県袋井市出身 ? サイバー系企業でデータマイニングエンジニア職 ? 創立記念日が3月18日 ? 社長の出身地が福井県鯖江市 ? 前職はバイオベンチャー ? バイオマーカ探索してた ? 学生時代は枯草菌の研究 2012/03/10 2
  • 4. サイバー系 アメーバピグで遊んでみた http://pigg.ameba.jp 2012/03/10 3
  • 5. サイバー系 作ってみた ? holiday()関数 2012/03/10 4
  • 6. サイバー系 問題提起 ? Rはいろんなことができて素晴らしいですよ! ? 休日もわかるよ!バースデー問題も秒殺! ? でも、「いいから使ってみて下さい」って言ってもな かなか使ってくれないよね ? コマンド?何それ? ?問題点 ?GUIがない ?マウスでポチっとな~ができない ?解決策 ?Rコマンダー ?Webアプリで作っちゃう 2012/03/10 5
  • 7. サイバー系 Rコマンダー ? Rコマンダーとは? ? RのGUIの一つ ? R StudioとかRattleとか,, ? 利点 ? マウス使える ? インストール ? install.packages(“Rcmdr”) ? 起動 ? require(Rcmdr) 2012/03/10 6
  • 8. サイバー系 Rコマンダー使用例 ? λ=3のポアソン分布ってどんな確率分布だったけ? ① ③ ② 2012/03/10 7
  • 9. サイバー系 Rコマンダーの圧倒的な利点 ? カスタマイズできる!! 2012/03/10 8
  • 10. サイバー系 Rコマンダーの圧倒的な利点 ? 先ほどのholiday()関数を使ってもらう ① ② ③ 2012/03/10 9
  • 11. サイバー系 Rコマンダーのカスタマイズ方法 ? メニューバーにメニューを追加 ? Rcmdrインストールフォルダ→etc→Rcmdr-menus.txt (C:?Users?wada_kazuya?Documents?R?win-library?2.14?Rcmdr) ★このテキストファイルをエディタで編集する 2012/03/10 10
  • 12. サイバー系 Rコマンダーのカスタマイズ方法 ? Rcmdr-menus.txtに以下を追加 ? Toolsメニューの下あたり(私の例では351行目の下) menu antibayMenu topMenu "" "" "" "" item antibayMenu command "休日チェキラ" tcl.holiday "" "" item topMenu cascade "あんちべ!" antibayMenu "" "" 3行目:トップメニューに「あんちべ!」文字列を追加してそれをantibayMeruと命名 1行目:antibayMenuをトップメニューに追加 2行目:antibayMenuに「休日チェキラ」という子メニューを追加して、 それがクリックされたときにtcl.holiday関数が呼ばれるようにする ★勘のいい皆様ならなんとなくわかるでしょう 2012/03/10 11
  • 13. サイバー系 Rコマンダーのカスタマイズ方法 ? ユーザ入力部分のUI(ダイアログ)は適当に作る tcl.holiday <-function(){ initializeDialog(title="休日チェキラ") #ダイアログのタイトル Var1 <- tclVar(substring(Sys.Date(),1,4)) #テキストボックスの初期値 Var1Entry <- tkentry(top, width=“20”, textvariable=Var1) onOK <- function(){ #OKボタン押した時の挙動 closeDialog() #閉じて XXX <- as.character(tclvalue(Var1)) #入力値を取得して command <- paste(“holiday(‘”, XXX, “’)”, sep=“”) #holiday関数呼ぶ doItAndPrint(command) #コマンド実行 #文字列生成 tkfocus(CommanderWindow()) #フォーカスを親に戻す } OKCancelHelp(helpSubject="+") tkgrid(tklabel(top, text=gettextRcmdr(“いつ?”)), Var1Entry, sticky=“e”) #テキストボックスの横のテキスト tkgrid(buttonsFrame, columnspan=2, sticky=“w”) #ボタン設置 tkgrid.configure(Var1Entry, sticky="w") #? } 2012/03/10 12
  • 14. サイバー系 Rコマンダーのカスタマイズ方法 ? R-cmdr-menus.txtと同様に、関数定義ファイルもetcフ ァイルに突っ込んでおく ? Rcmdrインストールフォルダ→etc (C:?Users?wada_kazuya?Documents?R?win-library?2.14?Rcmdr) ★etcフォルダに突っ込んでおけば、Rcmdr起動時に勝手にロードしてくれる 2012/03/10 13
  • 15. サイバー系 Rコマンダーのその他 ? Rコマンダーの注意点 ? Rcmdrのアップデートをしてしまうと、etcフォルダ内のフ ァイルが初期化(消去)されてしまうので努力が水の泡に ? Rコマンダーのカスタマイズ?他の方法 ? Rのパッケージ作るようにコンパイル済みのものを作ること も可能。zipファイルを配布してRコマンダーからアドオンイ ンポートしてカスタマイズ化できるからユーザにとってはこ ちらのほうが嬉しい。 ? 参考文献 http://www.okada.jp.org/RWiki/?RcmdrPlugin%C4%B6%C6%FE%CC%E7 http://cwoweb2.bai.ne.jp/~jgb11101/files/R-commander.pdf 2012/03/10 14
  • 17. サイバー系 Webアプリ作っちゃう ? Rook使う ? Rは(おバカな)webサーバを内蔵しているんです! ? Hello World的なのやってみよう install.packages("Rook") require(Rook) s <- Rhttpd$new() s$start(quiet=TRUE) s$browse(1) ★webブラウザが起動して何やらそれっぽい雰囲気に 2012/03/10 16
  • 18. サイバー系 Webアプリ作った ? Rookで作った source(“Rook.holiday.R”) holiday.start() ★できた 2012/03/10 17
  • 19. サイバー系 RookでのWebアプリ作成方法?1 ? ユーザ入力部分のUI(htmlのフォーム)は適当に作る Rook.holiday <- function(env) { source("holiday.R") req = Rook::Request$new(env) res = Rook::Response$new() res$write('いつ?:?n') res$write('<form method="POST">?n') res$write('<input type="text" name="xdim" value="2012">?n') res$write('<input type="submit" name="Go", value="holiday">?n</form>?n<br>') #まだまだ続く 入力formはhtmlで力業で書く 2012/03/10 18
  • 20. サイバー系 RookでのWebアプリ作成方法?2 ? ユーザ入力部分のUI(htmlのフォーム)は適当に作る?続き #Rook.holiday関数の続き if (!is.null(req$POST())) { y <- req$POST()[["xdim"]] #テキストフォームの入力値を取得 holidays <- holiday(y) #holiday関数の結果を取得 res$write("<p>") if(length(holidays)==1){ res$write(as.character(holidays)) }else if(is.matrix(holidays)){ for(i in 1:nrow(holidays)){ res$write(paste(as.character(holidays[i,1]), "<br>?n", sep="")) } }else{ for(i in 1:nrow(holidays)){ res$write(paste(as.character(holidays[i,1]), " | ", as.character(holidays[i,2]), "<br>",sep="")) } } res$write("</p>") } res$finish() } 結果もhtmlで力業で書く 2012/03/10 19
  • 21. サイバー系 RookでのWebアプリ作成方法?3 ? Webサーバ起動部分 holiday.start <- function(){ s <<- Rhttpd$new() #グローバル領域に変数を作成 #前ページで定義したRook.holiday関数にholidayと名付けて s$add(app = Rook.holiday, name = “holiday”) s$start() s$browse(“holiday”) #Rook.holiday関数を呼び出す } 2012/03/10 20
  • 22. サイバー系 デモ 2012/03/10 21
  • 23. サイバー系 最後に ? CUI嫌いな人にRを使ってもらうには... (使いこなすわけではない) ? Rコマンダーを使って、GUIを用意してやる ? Rookを使って、Webアプリ作って提供する ? ただし注意も必要 ? Rコマンダーカスタマイズを複数ユーザに設定するのはちょっと面 倒。しかも、Rcmdrアップデートするといろいろ消える ? Rookで実運用は(たぶん)できないのでrApacheとか使うといいか も 2012/03/10 22