RGtk2入門
―Rで作るGUIアプリ―


 大阪大学人間科学研究科
   博士後期課程
 林真広(@phosphor_m)
自己紹介

 社会学
 メディア論,インターネット研究
 主に質問紙調査(アンケート)のデータを分析していま
  す
 Osaka.Rやってます
今日の目的

 RGtk2で手軽にGUIを作る
 RのGUIをもっと充実させたい
   Rはプログラミングができない人も使っている
  • 初心者用デモ
  • 繰り返しの作業をマウスで誰でもできるように
  もっと手軽にグラフを描きた...
Rで使えるGUIツールキット

 tcltk
  組み込みパッケージ
  手軽だが低機能
 rJava
  Rからjavaを使うためのパッケージ
  javaの知識が必要
 RGtk2
  高機能
  基本的にはRの知識だけで...
GTK+とは?

 GTK+ (The GIMP Toolkit) はGIMPの実装のため
  に開発されたGUIツールキットで、Gimp Tool Kitの
  略である。オープンソースのGUIツールキットの中での
  品質の良さに注目され...
RGtk2を使ったパッケージ

 RGtk2DfEdit
 pmg
 rattle
 memiscGUI(作ってます!)
RGtk2のインストール

 RGtk2パッケージをインストール
 library(RGtk2)
 「GTKがない」というエラーとともに,Gtkをインストール
  するかどうか尋ねるダイアログが出る
 「Install GTK+」を選ぶ...
Hello, world!

lab <- gtkLabelNew("Hello, world!")
win <- gtkWindowNew()
gtkWindowSetTitle(win, "Test")
gtkContainerAdd(wi...
Widgetのクラス

lab <- gtkLabelNew("Hello, world!")
win <- gtkWindowNew()
gtkWindowSetTitle(win, "Test")
gtkContainerAdd(win, ...
GtkWindowクラスの階層

 GObject
  GInitiallyUnowned
  • GtkObject
   • GtkWidget
     • GtkContainer
       • GtkBin
         ...
簡略記法

lab <- gtkLabelNew("Hello, world!")
win <- gtkWindowNew()
win$setTitle("Test")
win$add(lab)

 「object$method」という簡略記...
プロパティへのアクセス

win <- gtkWindowNew()
win["title"] <- "Test"
# win$setTitle("Test") と同じ

 オブジェクトにはプロパティがある
 リストのようにアクセスできる
...
Hello, World! 2
win <- gtkWindowNew()
btn <- gtkButtonNew()
win$setDefaultSize(50, 50)
btn$setLabel("OK")
win$add(btn)

gS...
ボタンに機能を付ける

gSignalConnect(btn,"clicked",
               quote(cat("Hello, world!")))

 第1引数は機能を付けるオブジェクト
 第2引数("clicked...
シグナル(signal)




   GTK+のリファレンスマニュアルより
   イベントが起こるとシグナルが発せられる
   シグナルと処理が結び付けられていた場合,処理を実行する
   コールバック関数(イベントが起きたときに実行...
コールバック関数の作り方

onClicked <- function(obj, data){
  sprintf("Button[%s] is %s",
          obj$getLabel(), data)
}
gSignalCon...
実例:グラフィックスパラメータを変更する
      アプリケーション
 parが覚えきれない

          ウィンドウ


   パラメータ名         値

 こんなGUIがあれば便利かも
 parBox(“パラメータ名...
Widgetの作成

parBox <- function(par){ #ここから関数定義
  label <- gtkLabelNew(par)
  entry <- gtkEntryNew()
  hbox <- gtkHBoxNew()
...
グラフィックスパラメータの処理
val <- par()[[par]] # グラフィックスパラメータの値取得
if (is.character(val)) # 値が文字列かどうかで分岐
  val <- paste("¥"", val, "¥"...
コールバック関数

onEntryActivated <- function(obj, label){
  text <- obj$getText()
  text <- iconv(text, "UTF-8",
               ...
とりあえず実行

hbox <- parBox("mfrow")
win <- gtkWindowNew(show=FALSE)
win$add(hbox)
win$showAll()
全グラフィックスパラメータ一覧&変更
parGUI <- function(){
  par.names <- names(par())
  hboxes    <- lapply(par.names, parBox)
  vbox      ...
実行

parGUI()
レイアウト用Widgetの種類(1)

win   <- gtkWindowNew(show=FALSE)
note <- gtkNotebookNew() # タブインターフェース
paned <- gtkVPanedNew() # 二分割レ...
レイアウト用Widgetの種類(2)

win$add(note)
note$appendPage(paned)
paned$add1(vbox)
paned$add2(hbox)
vbox$packStart(label)
vbox$pack...
レイアウト用Widgetの種類(3)

              gtkNotebook


  gtkVBox


  gtkHBox
              gtkVPaned
参考になるもの(1)

 RGtk2のチュートリアルはlibrary内のPDF
   ビニエットにはなっていない
 クラスのヘルプは未完成だが有用
   ?GtkButton などとすると,クラスのヘルプが見られる
  クラスのヘルプ...
参考になるもの(2)

 本家のwidget一覧
  http://library.gnome.org/devel/gtk/unstable/ch02.html

 Ruby/GTK2 チュートリアル
  http://ruby-gno...
まとめ

 簡単な機能のものはすぐ作れる
 組み合わせていけば多機能に
 資料は,他言語のものならたくさんある
 ggplot2のGUIとかどうでしょう?
Upcoming SlideShare
Loading in...5
×

RGtk2入門

3,505

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,505
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
26
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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とかどうでしょう?
  1. Gostou de algum slide específico?

    Recortar slides é uma maneira fácil de colecionar informações para acessar mais tarde.

×