如何停止退出R gWidgets脚本

时间:2011-10-23 20:53:35

标签: r read-eval-print-loop gwidgets

我正在使用gWidgets工具包在使用Rscript运行的R脚本中创建GUI。

创建GUI时,脚本将退出。

我可以在脚本结尾处使用while(TRUE){Sys.sleep(9999)}循环来阻止这种情况,但这看起来很糟糕。

是否有更好的方法告诉R仅在GUI关闭时退出,或者至少在构建GUI后输入REPL?

6 个答案:

答案 0 :(得分: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”工具包同样适用。它几乎使用了Greg建议可以做的事情。

答案 1 :(得分:3)

这个主题可能会被关闭,但作为gwidgets的新手,我遇到了。 jverzani给出的解决方案显然是一种解决方案。我选择了另一个,没有使用任何补充对话,只是因为我不想要一个,没有其他理由......

在gwindow的处理程序中,处理后我从环境中删除变量:

handler = function(h,...) {dispose(EDFAnalysis$w); rm(w,envir=EDFAnalysis)}

其中EDFAnalysis是我脚本的环境...... w是主要的景点。

然后,在我的脚本结尾处,我添加了:

while(exists("w",EDFAnalysis)){Sys.sleep(5)}

当然,可以使用小于5或更大值的值。就我而言,5秒就足够了,而且永远不会......: - )

答案 2 :(得分:1)

处理此问题的标准方法是请求用户输入继续。这个单线程就行了。

编辑: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()

答案 3 :(得分:1)

如果您使用的是tcltk软件包而不是 gWidgets,那么您可以使用tkwait.window中的tcltk函数来告诉脚本等到gui窗口消失后再继续编写脚本。

答案 4 :(得分:1)

我发现,一个很好的方法是使用RGtk2库中的gtkMain()函数。这只会使主循环保持运行,直到调用gtkMainQuit()

答案 5 :(得分:0)

为了完整性:ozjimbob已经为大多数&#34;清洁&#34;提供了答案。如何做到这一点。 ffeschet的答案不适用于我,无论是在Unix上还是在Windows上。

因此,在主要&#34;发布&#34;脚本,你必须至少有这些条目:

options("guiToolkit"="RGtk2")
library(RGtk2)
library(gWidgets)
library(gWidgetsRGtk2)
StartMyGUI()
gtkMain()

在&#34;孩子&#34;进程&#34; StartMyGUI()&#34;,您的代码可以例如看起来像这样:

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()
} 

仅当用户点击&#34;取消&#34;将调用gtkMainQuit()的按钮,它将退出主进程中的母进程&#34;启动&#34;脚本。