gWidgets ツールキットを使用して、Rscript を使用して実行される R スクリプトで GUI を作成しています。
GUI が作成されると、スクリプトは終了します。
スクリプトの最後に while(TRUE){Sys.sleep(9999)} ループを追加することでこれを防ぐことができますが、これはハックのようです。
GUIが閉じられたときにのみ終了するか、少なくともGUIが構築されたらREPLに入るようにRに指示するより良い方法はありますか?
gWidgets ツールキットを使用して、Rscript を使用して実行される R スクリプトで GUI を作成しています。
GUI が作成されると、スクリプトは終了します。
スクリプトの最後に while(TRUE){Sys.sleep(9999)} ループを追加することでこれを防ぐことができますが、これはハックのようです。
GUIが閉じられたときにのみ終了するか、少なくともGUIが構築されたらREPLに入るようにRに指示するより良い方法はありますか?
必要に応じて gbasicdialog を調整できる場合があります。このコンストラクターは、他のウィンドウを生成できるモーダル コンテナーを作成します。次に例を示します。
library(gWidgets)
options(guiToolkit="RGtk2")
require(fortunes) # just for fun
hold_it <- gbasicdialog(do.buttons=FALSE)
b <- gbutton("click me for a message", cont=hold_it, handler=function(h,...) {
gmessage(paste(fortune(), collapse="\n"), parent=hold_it)
})
visible(hold_it, TRUE)
「tcltk」ツールキットでも同じことができます。それは、Greg が実行できると提案するほとんどのことを使用します。
このテーマは閉じられているかもしれませんが、gwidgets の初心者として、私は直面しています。jverzani によって与えられた解決策は明らかに解決策です。補助ダイアログを使用せずに、別のダイアログを選択しました。これは、必要ないという理由だけで、他の理由はまったくありません...
gwindow のハンドラーで、廃棄後に変数を環境から削除します。
handler = function(h,...) {dispose(EDFAnalysis$w); rm(w,envir=EDFAnalysis)}
EDFAnalysis
私のスクリプトの環境はどこですか...そしてw
メインのgwindowです。
次に、スクリプトの最後に次を追加しました。
while(exists("w",EDFAnalysis)){Sys.sleep(5)}
もちろん、5 より小さい値または大きい値を使用できます。私の場合、5秒で十分であり、永遠ではありません... :-)
私が見つけた良い方法はgtkMain()
、RGtk2 ライブラリの関数を使用することです。gtkMainQuit()
これは、が呼び出されるまでメイン ループを実行し続けるだけです。
代わりにtcltk
パッケージを使用している場合は、関数 fromを使用して、スクリプトを続行する前に、GUI ウィンドウが消えるまで待機するようにスクリプトに指示できます。 gWidgets
tkwait.window
tcltk
これを処理する標準的な方法は、続行するためにユーザー入力を要求することです。このワンライナーでうまくいきます。
編集:readline
インタラクティブな使用でのみ機能するためscan
、少し見栄えが悪い に交換しました。
pause_for_input <- function()
{
message("Press ENTER to continue")
invisible(scan(n = 0, quiet = TRUE))
}
したがって、スクリプトは次のようになります
#Create you GUI
#Whatever else
pause_for_input()
完全を期すために: ozjimbob は、最も「クリーンな」方法についてすでに答えを出しています。UnixでもWindowsでも、ffeschetの答えはうまくいきませんでした。
したがって、メインの「起動」スクリプトには、少なくとも次のエントリが必要です。
options("guiToolkit"="RGtk2")
library(RGtk2)
library(gWidgets)
library(gWidgetsRGtk2)
StartMyGUI()
gtkMain()
「子」プロセス「StartMyGUI()」では、コードは次のようになります。
StartMyGUI <- function(handler=function(h,...) {
dispose(h$obj)
}) {
window <- gwindow("Hello")
group <- ggroup(container = window)
glabel("Hello World!", container=group, expand=TRUE)
# A group to organize the buttons
button.group <- ggroup(container = group)
# Push buttons to right
addSpring(button.group)
gbutton("OK", handler=handler, container=button.group)
gbutton("Cancel", handler = function(h,...) {
dispose(window)
gtkMainQuit()
},
container=button.group)
return()
}
gtkMainQuit() が呼び出されるのは、ユーザーが「キャンセル」ボタンを押したときのみです。これにより、メインの「起動」スクリプトのマザー プロセスが終了します。