Как остановить выход из скрипта R gWidgets - PullRequest
3 голосов
/ 24 октября 2011

Я использую инструментарий gWidgets для создания GUI в R-скрипте, который запускается с использованием Rscript.

При создании графического интерфейса скрипт завершается.

Я могу предотвратить это с помощью цикла while (TRUE) {Sys.sleep (9999)} в конце скрипта, но это выглядит хакерским.

Есть ли лучший способ сообщить R о выходе, только когда графический интерфейс закрыт, или, по крайней мере, войти в REPL после создания графического интерфейса?

Ответы [ 6 ]

4 голосов
/ 25 октября 2011

Возможно, вы сможете адаптировать 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". Он использует в значительной степени то, что Грег предлагает сделать.

3 голосов
/ 19 ноября 2013

Эта тема может быть закрыта, но как новичок в gwidgets, я столкнулся с.Решение, данное jverzani, очевидно, является решением.Я выбрал другой, не используя никакого дополнительного диалога, просто потому, что я не хочу ни одного, никакой другой причины вообще ...

В обработчике gwindow, после удаления я удаляю переменную изenvironment:

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

, где EDFAnalysis - среда моего скрипта ... а w - главное окно.

Затем в концемоего сценария я добавил:

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

Конечно, можно использовать значение меньше 5 или больше.В моем случае 5 с достаточно и не навсегда ...: -)

1 голос
/ 10 декабря 2012

Я обнаружил, что хороший способ сделать это - использовать функцию gtkMain() в библиотеке RGtk2. Это просто поддерживает основной цикл, пока не будет вызван gtkMainQuit().

1 голос
/ 24 октября 2011

Если вы используете пакет tcltk вместо gWidgets, тогда вы можете использовать функцию tkwait.window из tcltk, чтобы заставить скрипт ждать, пока окно графического интерфейса не исчезнет, ​​прежде чемпродолжая сценарий.

1 голос
/ 24 октября 2011

Стандартный способ справиться с этим - запросить пользовательский ввод для продолжения. Этот однострочник сделает свое дело.

EDIT: 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()
0 голосов
/ 13 ноября 2014

Для полноты: ozjimbob уже дал ответ за самый «чистый» способ, как это сделать. Ответ ffeschet не работал со мной ни в Unix, ни в Windows.

Следовательно, в основном скрипте «запуска» вы должны как минимум иметь следующие записи:

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 (), которая выходит из материнского процесса в основном «запускающем» скрипте.

...