Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Upcoming SlideShare
オレオレR-GUIを作りたい
Next
Download to read offline and view in fullscreen.

4

Share

Download to read offline

RGtk2入門

Download to read offline

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

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とかどうでしょう?
  • yasuhirosakuramoto

    Mar. 28, 2018
  • YasuyukiAkamatsu

    Apr. 25, 2016
  • ssuser29b03a

    Jul. 17, 2015
  • yasukokawahata

    Feb. 27, 2015

Views

Total views

6,263

On Slideshare

0

From embeds

0

Number of embeds

249

Actions

Downloads

34

Shares

0

Comments

0

Likes

4

×