RGtk2入門

5,076 views

Published on

Published in: Technology
  • Be the first to comment

RGtk2入門

  1. 1. RGtk2入門 ―Rで作るGUIアプリ― 大阪大学人間科学研究科 博士後期課程 林真広(@phosphor_m)
  2. 2. 自己紹介  社会学  メディア論,インターネット研究  主に質問紙調査(アンケート)のデータを分析していま す  Osaka.Rやってます
  3. 3. 今日の目的  RGtk2で手軽にGUIを作る  RのGUIをもっと充実させたい  Rはプログラミングができない人も使っている • 初心者用デモ • 繰り返しの作業をマウスで誰でもできるように  もっと手軽にグラフを描きたい • グラフィックスを対話的に調整
  4. 4. Rで使えるGUIツールキット  tcltk  組み込みパッケージ  手軽だが低機能  rJava  Rからjavaを使うためのパッケージ  javaの知識が必要  RGtk2  高機能  基本的にはRの知識だけで大丈夫
  5. 5. GTK+とは?  GTK+ (The GIMP Toolkit) はGIMPの実装のため に開発されたGUIツールキットで、Gimp Tool Kitの 略である。オープンソースのGUIツールキットの中での 品質の良さに注目され、GNOMEデスクトップ環境のツー ルキットとして採用される。(Wikipediaより)  RGtk2はGTK+2をR上で使うためのパッケージ
  6. 6. RGtk2を使ったパッケージ  RGtk2DfEdit  pmg  rattle  memiscGUI(作ってます!)
  7. 7. RGtk2のインストール  RGtk2パッケージをインストール  library(RGtk2)  「GTKがない」というエラーとともに,Gtkをインストール するかどうか尋ねるダイアログが出る  「Install GTK+」を選ぶとダウンロード&インストール が始まる  インストール終了後,再起動
  8. 8. Hello, world! lab <- gtkLabelNew("Hello, world!") win <- gtkWindowNew() gtkWindowSetTitle(win, "Test") gtkContainerAdd(win, lab)
  9. 9. Widgetのクラス lab <- gtkLabelNew("Hello, world!") win <- gtkWindowNew() gtkWindowSetTitle(win, "Test") gtkContainerAdd(win, lab)  下線がクラス,斜体がメソッド  クラスの継承あり  GtkWindowはGtkContainerの下位クラス
  10. 10. GtkWindowクラスの階層  GObject  GInitiallyUnowned • GtkObject • GtkWidget • GtkContainer • GtkBin • GtkWindow  探している機能が,上位のクラスのメソッドな場 合がある
  11. 11. 簡略記法 lab <- gtkLabelNew("Hello, world!") win <- gtkWindowNew() win$setTitle("Test") win$add(lab)  「object$method」という簡略記法もある  第1引数は省略する  キャメルケース可
  12. 12. プロパティへのアクセス win <- gtkWindowNew() win["title"] <- "Test" # win$setTitle("Test") と同じ  オブジェクトにはプロパティがある  リストのようにアクセスできる  names(object$getPropInfo()) でどんなプロパティ があるかわかる  詳細はGtkのリファレンスで(RGtk2のヘルプは未完成)
  13. 13. Hello, World! 2 win <- gtkWindowNew() btn <- gtkButtonNew() win$setDefaultSize(50, 50) btn$setLabel("OK") win$add(btn) gSignalConnect(btn,"clicked", quote(cat("Hello, world!")))  ボタンを押すと”Hello, World!”がコンソールに表示さ れる
  14. 14. ボタンに機能を付ける gSignalConnect(btn,"clicked", quote(cat("Hello, world!")))  第1引数は機能を付けるオブジェクト  第2引数("clicked")はオブジェクトが起こすイベント  第3引数はイベントが起こったときに実行される関数 (または関数呼び出し)
  15. 15. シグナル(signal)  GTK+のリファレンスマニュアルより  イベントが起こるとシグナルが発せられる  シグナルと処理が結び付けられていた場合,処理を実行する  コールバック関数(イベントが起きたときに実行される処理)に 渡される引数が重要  この場合,シグナルを発したオブジェクト(gtkButton)と任意のデータ
  16. 16. コールバック関数の作り方 onClicked <- function(obj, data){ sprintf("Button[%s] is %s", obj$getLabel(), data) } gSignalConnect(btn,"clicked", onClicked, data="is clicked!")  第4引数(data)は任意のデータ  引数としてlistを渡せば,コールバック関数に好きな だけデータを渡せる
  17. 17. 実例:グラフィックスパラメータを変更する アプリケーション  parが覚えきれない ウィンドウ パラメータ名 値  こんなGUIがあれば便利かも  parBox(“パラメータ名”)で,Windowの内部に配置す るWidgetを返す関数を作る
  18. 18. Widgetの作成 parBox <- function(par){ #ここから関数定義 label <- gtkLabelNew(par) entry <- gtkEntryNew() hbox <- gtkHBoxNew() hbox$packStart(label) hbox$packStart(entry) # 引数parは,グラフィックスパラメータ名 # まず,必要な部品(widget)を用意する
  19. 19. グラフィックスパラメータの処理 val <- par()[[par]] # グラフィックスパラメータの値取得 if (is.character(val)) # 値が文字列かどうかで分岐 val <- paste("¥"", val, "¥"" , sep="", collapse=",") else val <- paste(as.character(val), sep="", collapse=",") entry$setText(val) # 値をgtkEntryにセット gSignalConnect(entry, "activate", onEntryActivated, par) # entry内でエンターを押したときの処理 return(hbox) } # 関数定義終わり
  20. 20. コールバック関数 onEntryActivated <- function(obj, label){ text <- obj$getText() text <- iconv(text, "UTF-8", localeToCharset()[1]) # widget内で文字列はUTF-8なので, # ロケールを取得してエンコード変換 text <- sprintf("par(%s=c(%s))", label, text) print(text) eval(parse(text=text)) }
  21. 21. とりあえず実行 hbox <- parBox("mfrow") win <- gtkWindowNew(show=FALSE) win$add(hbox) win$showAll()
  22. 22. 全グラフィックスパラメータ一覧&変更 parGUI <- function(){ par.names <- names(par()) hboxes <- lapply(par.names, parBox) vbox <- gtkVBoxNew() lapply(hboxes, vbox$packStart) sw <- gtkScrolledWindowNew() sw$addWithViewport(vbox) win <- gtkWindowNew(show=FALSE) win$add(sw) win$showAll() }
  23. 23. 実行 parGUI()
  24. 24. レイアウト用Widgetの種類(1) win <- gtkWindowNew(show=FALSE) note <- gtkNotebookNew() # タブインターフェース paned <- gtkVPanedNew() # 二分割レイアウト hbox <- gtkHBoxNew() # widgetを横に詰め込む vbox <- gtkVBoxNew() # widgetを縦に詰め込む label <- gtkLabelNew("Label") entry <- gtkEntryNew() entry$setText("Entry") btn1 <- gtkButtonNewWithLabel("Button1") btn2 <- gtkButtonNewWithLabel("Button2")
  25. 25. レイアウト用Widgetの種類(2) win$add(note) note$appendPage(paned) paned$add1(vbox) paned$add2(hbox) vbox$packStart(label) vbox$packStart(entry) hbox$packStart(btn1) hbox$packStart(btn2) win$showAll()
  26. 26. レイアウト用Widgetの種類(3) gtkNotebook gtkVBox gtkHBox gtkVPaned
  27. 27. 参考になるもの(1)  RGtk2のチュートリアルはlibrary内のPDF  ビニエットにはなっていない  クラスのヘルプは未完成だが有用  ?GtkButton などとすると,クラスのヘルプが見られる  クラスのヘルプにはそのクラスのメソッド一覧,ヒエラルキー, 簡単なexampleがなどある  最後尾に本家GTK+のリファレンスマニュアルへのリンク • signalとpropertyは本家でもRGtk2でも同じなので,とても有用
  28. 28. 参考になるもの(2)  本家のwidget一覧  http://library.gnome.org/devel/gtk/unstable/ch02.html  Ruby/GTK2 チュートリアル  http://ruby-gnome2.sourceforge.jp/ja/hiki.cgi?gtk2-tut  Ruby,Python,PHPのGTK+のサンプル・文書は,これら の言語を知らなくても役に立つ  RGtk2の資料は皆無に等しいので,他言語でのノウハウを流用  慣れてきたら,RGtk2DfEdit(RGtk2を使ったパッケージ)の ソースを読むとよい
  29. 29. まとめ  簡単な機能のものはすぐ作れる  組み合わせていけば多機能に  資料は,他言語のものならたくさんある  ggplot2のGUIとかどうでしょう?

×