Библиотека сайта rus-linux.net
Создание простого GUI в R с помощью библиотеки RGtk2
Оригинал: Build a simple GUI with RGtk2
Автор: TuxetteChix
Дата публикации: 24 августа 2012 года
Перевод: А. Кривошей
Дата перевода: апрель 2017 г.
В этой статье представлено базовое введение в возможности пакета , который обеспечивает создание программ с графическим интерфейсом в R с использованием библиотеки Gtk.
Многие пользователи пишут скрипты R, принимающие на вход некоторые числовые данные, и возвращающие их статистические показатели. Взяв такой скрипт в качестве примера, я покажу, как создать графический интерфейс, принимающий имя файла CSV, и выводящий всплывающее окно со стандартными статистическими показателями для данных из файла. Он также позволит пользователю сохранить результат в файле CSV.
Требования
Для выполнения поставленных задач нам потребуются:
- три библиоткеи R: RGtk2, e1071 (требуется для вычисления коэффициентов ассиметрии и эксцесса) и ineq (для вычисления коэффициента Джини);
- скрипт "WhatMyTeacherWants", сделанный студентами для их проекта по статистике.
- с данными для примера (на самом деле это известный набор данных ирисов Фишера).
Создание окна ввода
Сначала создадим окно ввода с информацией о файле данных и опциями для выбора сохранения результатов:
Создаем окно и добавляем его имя:
# Создаем окно window = gtkWindow() # Добавляем имя window["title"] = "Standard statistics for numerical variables"
Далее, хотя это не является обязательным (но так лучше), вставляем фрейм в окно.
# Добавляем фрейм
frame = gtkFrameNew("Specify data location...")
window$add(frame)
В фрейм вставляется вертикальный контейнер для добавления нескольких виджетов, а для каждого виджета создается и вставляется горизонтальный контейнер:
Первый элемент первой строки - это метка "Filename", второй элемент первой строки - поле ввода, куда пользователь вводит имя файла (и директории, если это необходимо). Поле получает имя filename, которое будет передаваться в программу после клика на "OK" и доступ к которому предоставляется с помощью "Alt+F" (посмотрите на подчеркнутое F; это делается функцией gtkLabelNewWithMnemonic и атрибутом setMnemonicWidget). Размер текстового поля ограничен 50 символами.
label = gtkLabelNewWithMnemonic("_File name")
hbox$packStart(label,FALSE,FALSE,0)
# Добавляем поле во второй столбец с именем "filename"
filename = gtkEntryNew()
filename$setWidthChars(50)
label$setMnemonicWidget(filename)
hbox$packStart(filename,FALSE,FALSE,0)
Последующие строки очень похожи и с чекбоксами (по умолчанию можно установить "check" с использованием опции active). Значение по умолчанию для текстовых полей задается опцией setText.
В нижней части располагаются кнопки: "OK" для вызова WhatMyTeacherWants и "Close" для закрытия GUI, что выполняется при помощи функции gSignalConnect.
# Добавляем кнопки
the.buttons = gtkHButtonBoxNew()
the.buttons$setBorderWidth(5)
vbox$add(the.buttons)
the.buttons$setLayout("spread")
the.buttons$setSpacing(40)
buttonOK = gtkButtonNewFromStock("gtk-ok")
gSignalConnect(buttonOK, "clicked", performStatistics)
the.buttons$packStart(buttonOK,fill=F)
buttonCancel = gtkButtonNewFromStock("gtk-close")
gSignalConnect(buttonCancel, "clicked", window$destroy)
the.buttons$packStart(buttonCancel,fill=F)
Функция performStatistics
Эта функция, вызываемая по клику на "OK", должна:
- импортировать данные из заданного файла;
- найти численные переменные в этих данных и вернуть сообщение об ошибке, если таких переменных нет;
- запустить скрипт WhatMyTeacherWants на численных переменных;
- вывести результаты в новом окне. Это новое окно содержит две кнопки: "OK" для возврата в предыдущее окно и "Close" для немедленного выхода.
На датасете iris мы получим следующий результат:

где результаты записаны в файл ex-data.txt (файл находится в рабочей директории), разделителем столбцов является пробел, чекбокс "Save results?" активируется до нажатия кнопки "OK". Данные сохраняются в виде простой таблицы, также выводится дополнительное сообщение о том, что данные были успешно сохранены.
Диалоговое окно создается с помощью следующего кода:
который включает заголовок окна "Might be helpful for lazy students", имя родительского окна "window", опцию "modal", означающую, что программа будет ждать ответа пользователя ("OK" или "quit"), а также кнопки, которые будут отображаться в нижней части окна. Действия, соответствующие этим кнопкам, задаются следующим образом:
response = dialog$run()
# Возврат в предыдущее окно
if (response == GtkResponseType["ok"]) {
dialog$destroy()
}
# Закрываем все окна
if (response == GtkResponseType["cancel"]) {
dialog$destroy()
window$destroy()
}
Полный код функции performStatistics приведен в файле GraphicalInterface.R (все материалы хранятся в tar.gz - функция WhatMyTeacherWants, файл с данными примера и код GUI в виде функции).
После распаковки архива скрипт можно протестировать с помощью следующего кода R:
library(RGtk2)
library(e1071)
library(ineq)
source("WhatMyTeacherWants.R")
source("GraphicalInterface.R")
calculateGUI()
и заполняем форму, как показано на следующем рисунке:

Если данные не содержат по крайней мере одной численной переменной, появится следующее сообщение об ошибке:

(для тестирования можно использовать файл wrong-data.csv, имеющийся в нашем архиве).
