Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Создание простого GUI в R с помощью библиотеки RGtk2

Оригинал: Build a simple GUI with RGtk2
Автор: TuxetteChix
Дата публикации: 24 августа 2012 года
Перевод: А. Кривошей
Дата перевода: апрель 2017 г.

В этой статье представлено базовое введение в возможности пакета RGtk2, который обеспечивает создание программ с графическим интерфейсом в 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 мы получим следующий результат:

результат на 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, имеющийся в нашем архиве).