我正在使用gWidgets工具包在使用Rscript运行的R脚本中创建GUI。
创建GUI时,脚本将退出。
我可以在脚本结尾处使用while(TRUE){Sys.sleep(9999)}循环来阻止这种情况,但这看起来很糟糕。
是否有更好的方法告诉R仅在GUI关闭时退出,或者至少在构建GUI后输入REPL?
答案 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;脚本。