2011-10-23 8 views
3

gWidgetsツールキットを使用して、Rscriptを使用して実行されるRスクリプトでGUIを作成しています。R gWidgetsスクリプトを終了する方法

GUIを作成すると、スクリプトが終了します。

スクリプトの最後にwhile(TRUE){Sys.sleep(9999)}ループでこれを防ぐことができますが、これはハッキリのようです。

GUIが閉じられたときにのみ終了するように、または少なくともGUIが構築された後にREPLに入るようにRに伝えるより良い方法はありますか?

+0

これは本質的にこれと同じ質問です:http://stackoverflow.com/questions/7835947/external-graphical-device-for-littler-or-rscript –

+0

正しい、Dirkですが、その質問に対する答えはa少し不明。 –

+0

はい、私はその質問を見ていませんでしたが、私が既に提案していることの1つを行っているので、それは役に立たないと思います。これもありますが、もう少しハッキーです。http://stackoverflow.com/questions/7695177/how-to-provide-expression-to-r-from-command-line-but-stop-r-from-immediately -exi –

答えて

1

これを処理する標準的な方法は、ユーザー入力を続行するように要求することです。この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() 
+0

Hmm。実際、 'readline'のドキュメントを読むと' littler'でうまくいくかどうかわかりません。誰か確認してもらえますか? –

1

のようになります。スクリプトを続行する前にGUIウィンドウが消えます。

+0

私はGtkパッケージを使用していますが、それはまさに親しみのためです。 –

+0

Gtkはtcltkに依存していますか?そうであれば、同じ解決策が適用されるかもしれません。そうでなければ、GtkがGUI内のイベントを待つ同様の機能を持っているかどうかを見てください。 –

4

必要に応じて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"ツールキットでも同じです。グレッグが何をすることができるかをかなり使っています。

+0

本当に便利で楽しい.... littler + gWidgetsの岩。 GUIプログラミングについてのあなたの新しい本を読むのを待つことはできません! – dickoa

1

RGtk2ライブラリでgtkMain()関数を使用することをお勧めします。これにより、単にgtkMainQuit()が呼び出されるまでメインループが実行されたままになります。

+1

どうやって使用しますか? (ドキュメンテーションはあいまいではありません) – AdrieanKhisbe

3

この件名は閉鎖されているかもしれませんが、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秒で十分であり、これまでにない...:

0

完成度: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() 
} 

それはあります。

関連する問題