Библиотека сайта rus-linux.net
Создание простого GUI в R с помощью библиотеки RGtk2
Оригинал: Build a simple GUI with RGtk2
Автор: TuxetteChix
Дата публикации: 24 августа 2012 года
Перевод: А. Кривошей
Дата перевода: апрель 2017 г.
В этой статье представлено базовое введение в возможности пакета
Многие пользователи пишут скрипты 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 (все материалы хранятся в
После распаковки архива скрипт можно протестировать с помощью следующего кода R:
library(RGtk2) library(e1071) library(ineq) source("WhatMyTeacherWants.R") source("GraphicalInterface.R") calculateGUI()
и заполняем форму, как показано на следующем рисунке:
Если данные не содержат по крайней мере одной численной переменной, появится следующее сообщение об ошибке:
(для тестирования можно использовать файл wrong-data.csv, имеющийся в нашем архиве).