gWidgetsツールキットを使用して、Rscriptを使用して実行されるRスクリプトでGUIを作成しています。R gWidgetsスクリプトを終了する方法
GUIを作成すると、スクリプトが終了します。
スクリプトの最後にwhile(TRUE){Sys.sleep(9999)}ループでこれを防ぐことができますが、これはハッキリのようです。
GUIが閉じられたときにのみ終了するように、または少なくともGUIが構築された後にREPLに入るようにRに伝えるより良い方法はありますか?
gWidgetsツールキットを使用して、Rscriptを使用して実行されるRスクリプトでGUIを作成しています。R gWidgetsスクリプトを終了する方法
GUIを作成すると、スクリプトが終了します。
スクリプトの最後にwhile(TRUE){Sys.sleep(9999)}ループでこれを防ぐことができますが、これはハッキリのようです。
GUIが閉じられたときにのみ終了するように、または少なくともGUIが構築された後にREPLに入るようにRに伝えるより良い方法はありますか?
これを処理する標準的な方法は、ユーザー入力を続行するように要求することです。この1ライナーはトリックを行います。
編集:readline
はインタラクティブにしか使用できませんので、私はscan
のために交換しました。あなたがされるまで待つようにスクリプトを伝えるために、あなたはおそらくtcltk
からtkwait.window
機能を使用することができgWidgets
の代わりにtcltk
パッケージを使用している場合
pause_for_input <- function() { message("Press ENTER to continue") invisible(scan(n = 0, quiet = TRUE)) }
は、だから、スクリプトが #Create you GUI
#Whatever else
pause_for_input()
Hmm。実際、 'readline'のドキュメントを読むと' littler'でうまくいくかどうかわかりません。誰か確認してもらえますか? –
のようになります。スクリプトを続行する前にGUIウィンドウが消えます。
私はGtkパッケージを使用していますが、それはまさに親しみのためです。 –
Gtkはtcltkに依存していますか?そうであれば、同じ解決策が適用されるかもしれません。そうでなければ、GtkがGUI内のイベントを待つ同様の機能を持っているかどうかを見てください。 –
必要に応じて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"ツールキットでも同じです。グレッグが何をすることができるかをかなり使っています。
本当に便利で楽しい.... littler + gWidgetsの岩。 GUIプログラミングについてのあなたの新しい本を読むのを待つことはできません! – dickoa
RGtk2ライブラリでgtkMain()
関数を使用することをお勧めします。これにより、単にgtkMainQuit()
が呼び出されるまでメインループが実行されたままになります。
どうやって使用しますか? (ドキュメンテーションはあいまいではありません) – AdrieanKhisbe
この件名は閉鎖されているかもしれませんが、gwidgetsの新人として、私は直面しています。 jverzaniが提供するソリューションは明らかに解決策です。私は別のものを選択しました。補足的なダイアログを使用していないのは、他に理由がないからです。
gwindowのハンドラでは、処理後に変数を環境から削除します。 EDFAnalysis
は私のスクリプト...とw
の環境で
handler = function(h,...) {dispose(EDFAnalysis$w); rm(w,envir=EDFAnalysis)}
はメインgwindowです。
その後、私のスクリプトの最後に私が追加:もちろん
while(exists("w",EDFAnalysis)){Sys.sleep(5)}
、5以上の値が使用されるよりも小さい値。私の場合、5秒で十分であり、これまでにない...:
完成度:ozjimbobは、すでに「クリーン」な方法で答えを出しています。 ffchechetの答えは私にとってはうまくいかず、UnixでもWindowsではうまくいきませんでした。例えば、「子」プロセス「StartMyGUI()」では
options("guiToolkit"="RGtk2")
library(RGtk2)
library(gWidgets)
library(gWidgetsRGtk2)
StartMyGUI()
gtkMain()
、あなたのコードができますしたがって
、メインの「起動」スクリプトで、あなたには、少なくともこれらのエントリを持っている必要があります次のようになります。ユーザーはメインの「起動」スクリプトで母のプロセスを終了gtkMainQuit()が呼び出されます、「キャンセル」ボタンを、ヒットした場合にのみ
が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()
}
それはあります。
これは本質的にこれと同じ質問です:http://stackoverflow.com/questions/7835947/external-graphical-device-for-littler-or-rscript –
正しい、Dirkですが、その質問に対する答えはa少し不明。 –
はい、私はその質問を見ていませんでしたが、私が既に提案していることの1つを行っているので、それは役に立たないと思います。これもありますが、もう少しハッキーです。http://stackoverflow.com/questions/7695177/how-to-provide-expression-to-r-from-command-line-but-stop-r-from-immediately -exi –