Искате ли Вашите R-скриптове да могат да се пускат от потребители без умения за програмиране? Създайте удобно и понятно десктоп приложение.
Езика R е предназначен предимно за Back End програмиране, но на него може да се разработи достатъчно удобен графичен интерфейс. В тази статия ще разкажа какви графични елементи можете да създадете с помощта на пакета «gWidgets» и ще споделя няколко примера за интерфейс, разработен на R.
Как да инсталираме пакета «gWidgets»?
Разработката на интерфейса започва с инсталирането и включването на пакетите «gWidgets». В
install.packages(“gWidgets”)install.packages
(“gWidgetstcltk”)library(“gWidgets”)library
(“gWidgetstcltk”)options("guiToolkit"="tcltk")
Какви елементи на интерфейса са достъпни?
В пакета «gWidgets» има достатъчно много графични елементи за интерфейса — да разгледаме основните.
1. Диалогов прозорец — «gwindow» и «gbasicdialog»
Основен и главен контейнер за всички графични елементи на интерфейса.
Ако планирате в бъдеще да стартирате разработения интерфейс с помощта на BAT или EXE-файл, препоръчвам в качеството на главен контейнер да използвате «gbasicdialog». При стартиране от BAT-файл елементът на интерфейса «gwindow» се изгражда и моментално се затваря, без да чака действия от потребителя.
Готово, вече съществува начин, който да Ви позволи да стартирате интерфейс с помощта на BAT-файл, дори ако е изграден чрез «gwindow». Веднага след завършването на кода на графичния интерфейс, използвайте командата «Sys.sleep(300)» и прозорецът няма да се затваря.
Синтаксис:
gwindow(title = "Window", visible = TRUE,
name=title,width = NULL, height= NULL,
parent=NULL,handler = NULL, action = NULL,...,
toolkit = guiToolkit())gbasicdialog(title = "Dialog",
widget, parent=NULL, do.buttons=TRUE,handler =
NULL, action=NULL, ..., toolkit=guiToolkit())
Основни аргументи:
- title — заглавие на диалоговия прозорец.
- visible — видимост на диалоговия прозорец, приема стойност «FALSE» или «TRUE». Може да се изключи видимостта на изграждането на прозореца и на всички негови елементи и да го включите, след като прозорецът бъде напълно формиран, с помощта на функция visible.
- handler — обработчик на събития, в които Вие пишете анонимна функция, стартираща се при активиране на елемента. Задължителни аргументи в тази функция — function(h,...).
2. Бутон — «gbutton»
Функцията «gbutton» създава бутон в посочения контейнер.
Синтаксис:
gbutton(text = "", border=TRUE, handler = NULL, action = NULL, container = NULL, ..., toolkit = guiToolkit())
Основни аргументи:
- text — текст на бутона.
- handler — обработчик на събития, в които Вие пишете анонимна функция, стартираща се при активиране на елемента. Задължителни аргументи на тази функция — function(h,...).
- container — контейнер, в който се поставя бутона.
Пример на използване:
obj <- gbutton("Hello world", container = gwindow())
3. Етикет — «glabel»
Текстов блок в диалоговия прозорец, който се използва за описание на различна информация.
Синтаксис:
glabel(text = "", markup = FALSE, editable = FALSE, handler = NULL,action = NULL, container = NULL, ..., toolkit = guiToolkit())
Основни аргументи:
- text — текст на етикета.
- handler — обработчик на събития, в които Вие пишете анонимна функция, стартираща се при активиране на елемента. Задължителни аргументи на тази функция — function(h,...).
- container — контейнер, в който ще бъде поставен поставен етикета.
Пример на използване:
obj <- glabel("Hello world", container = gwindow())
4. Текстово поле — «gedit»
В диалоговия прозорец се появява текстово поле, в което потребителят може да въвежда свои данни.
Синтаксис:
gedit(text = "", width = 25, coerce.with = NULL, initial.msg="",handler = NULL, action = NULL, container = NULL, ..., toolkit = guiToolkit())
Основни аргументи:
- text — текст на етикета.
- handler — обработва събития, в които Вие пишете анонимна функция, стартираща се при активиране на елемента. Задължителни аргументи на тази функция — function(h,...).
- container — контейнер за текстово поле.
Пример на използване:
obj <- gedit("Hello world", container = gwindow())
5. Списък с възможност за избор на един елемент — «gradio»
Списък, в който може да се отбележи един елемент.
Синтаксис:
gradio(items, selected = 1, horizontal = FALSE, handler= NULL, action = NULL, container = NULL, ..., toolkit = guiToolkit())
Основни аргументи:
- items — вектор от стойности, възможни за избиране.
- selected — числова стойност на номера на елемента, който ще бъде избран по подразбиране.
- horizontal — ориентация на списъка (TRUE — хоризонтална, FALSE — вертикална).
- handler — обработване на събития, в които Вие пишете анонимна функция, стартираща се при активиране на елемента. Задължителни аргументи на тази функция — function(h,...).
- container — контейнер, в който се поставя списъка.
Пример на използване:
obj <- gradio(c("hello","world"), container=gwindow())
6. Падащ списък — «gcombobox»
Падащия списък е по-компактна алтернатива на списъка с възможност за избор на един елемент.
Синтаксис:
gcombobox(items, selected = 1, editable = FALSE, coerce.with=NULL, handler = NULL, action = NULL, container = NULL, ..., toolkit = guiToolkit())
Основни аргументи:
- items — вектор от стойности, възможни за избиране.
- selected — числова стойност на номера на елемента, който ще бъде избран по подразбиране.
- handler — обработване на събития, в които Вие пишете анонимна функция, стартираща се при активиране на елемента. Задължителни аргументи на тази функция — function(h,...).
- container — контейнер за поставяне на падащия списък.
Пример на използване:
obj <- gcombobox(c("hello","world"), container=gwindow())
7. Списък с възможност за избор на няколко елемента — «gcheckboxgroup»
Пакетът «gcheckboxgroup» дава възможност на потребителя да маркира произволен брой елементи от списъка.
Синтаксис:
gcheckboxgroup(items, checked = FALSE, horizontal = FALSE, use.table=FALSE, handler = NULL, action = NULL, container = NULL, ..., toolkit = guiToolkit())
Основни аргументи:
- items — вектор от стойности, възможни за избиране.
- horizontal — ориентация на списъка (TRUE — хоризонтална, FALSE — вертикална).
- handler — обработване на събития, в които Вие пишете анонимна функция, стартираща се при активиране на елемента. Задължителни аргументи на тази функция — function(h,...).
- container — контейнер за поставяне на списъка.
Пример на използване:
obj <- gcheckboxgroup(c("hello","world"), container=gwindow()
8. Календар — «gcalendar»
С помощта на този елемент удобно се избира дата.
Синтаксис:
gcalendar(text = "", format = "%Y-%m-%d", handler=NULL,action=NULL, container = NULL, ..., toolkit = guiToolkit())
Основни аргументи:
- text — дата по подразбиране.
- format — формат, в който се показва датата.
- handler — обработване на събития, в които Вие пишете анонимна функция, стартираща се при активиране на елемента. Задължителни аргументи на тази функция — function(h,...).
- container — контейнер, в който се показва календара.
Пример на използване:
obj <- gcalendar(text = as.character(Sys.Date()),container=gwindow())
9. Избор на папка или файл — «gfile»
Този елемент показва на екрана диалогов прозорец за отваряне или съхраняване на файлове и папки.
Синтаксис:
gfile(text = "", type = c("open", "save", "selectdir"),
initialfilename = NULL, filter = list("All files"
= list(patterns = c("*")), "R files" = list(patterns
= c("*.R","*.Rdata")), "text files"
= list(mime.types = c("text/plain"))
), multi=FALSE, handler = NULL, action
= NULL, ..., toolkit = guiToolkit())
Основни аргументи:
- text — заглавие на диалогов прозорец, отварящ се за избор на файл или папка.
- type — тип на диалогов прозорец, приема стойност «open» (получи път до файла), «save» (запази обекта във вид на файл) и «selectdir» (получи път до папка).
- handler — обработване на събития, в които Вие пишете анонимна функция, стартираща се при активиране на елемента. Задължителни аргументи на тази функция — function(h,...).
Пример на използване:
obj <- gbutton("Select file", container=gwindow(), handler = function(h,...) {gfile(text = "Select file", type = "selectdir")})
Как да разработим елементарен графичен интерфейс?
Да разгледаме как може да се прилагат основни елементи от пакета. За пример, да създадем текстово поле с възможност за въвеждане на свое име и бутон, при натискане на който да се появи приветствено съобщение.
- За основен контейнер избираме «gwindow».
main_window <- gwindow(title = "My main windows")
Функцията «gwindow(title = "My main windows")» създава главния диалогов прозорец, който трябва да се напълни с графични елементи.
- В началото добавяме текстов етикет, за да обясним на потребителите какви данни трябва да се въведат в полето.
За да създадете етикет, използвайте функция «glable("Enter your name", container = main_window)». Първият аргумент отговаря за текста на етикета. Аргументът container сочи контейнера, в който ще се показва етикетът — ние сме посочили «main_window», тъй като именно в този обект сме запазили създадения в първата стъпка диалогов прозорец.
- Последният елемент на диалоговия прозорец е бутонът «Hello!».
Бутонът се създава с помощта на функция «gbutton("Hello!", container = main_window, handler = function(h,...)». Първият аргумент отговаря за текста на бутона, вторият — сочи контейнера, в който ще се показва бутонът. Аргументът «handler» обработва събитие, а значи в него трябва да се опише функцията, която се изпълнява при натискане на бутона:
function(h,...){gmessage(paste0("Hello ",svalue(username),"!"))}
Тази функция извежда на екрана съобщение, създадено с помощта на функция «gmessage». За да се появи име, въведено от потребителя в текстовото поле, аз използвам функция «svalue» — тя приема в качеството на аргумент обект, чиято стойност искате да получите.
- В резултат ще получите такъв код:
#Создаем диалоговое окноmain_window <- gwindow(title =
"My main windows")#Добавляем подпись к текстовому полюglable
("Enter your name", container = main_window)#Добавляем текстовое полеusername
<- gedit("User name", container = main_window)#Добавляем кнопкуgbutton("Hello!",
container = main_window, handler = function(h,...)
{#Описываем действия которые будут
выполнены при нажатие на кнопкуgmessage(paste0("Hello ",
svalue(username),"!"))})
Задействайте кода в R-конзолата или R Studio и ще се формира диалогов прозорец.
В текстовото поле може да въведете своето име и да натиснете бутон «Hello!», след това ще се появи приветстващо съобщение.
Пример на сложен графичен интерфейс, разработен в R
Използвайки пакета «gWidgets», може да се създават и достатъчно сложни интерфейси.
В тази точка ще покажа графичен интерфейс за стартиране на скриптове. В диалоговите прозорци може да се въведат потребителски параметри, необходими за свързване към API, да се избере период на статистика и конкретни скриптове. След натискане на бутона «Start» започва процес на събиране на данни.
Скрипт за създаване на показания по-горе интерфейс:
library(gWidgets)library(gWidgetstcltk)library(lubridate)options(guiToolkit="tcltk")
#переходим в рабочую директориюsetwd("C:/ppc_bi")#ПериодcurrentDate <-Sys.Date()eopm
<- currentDate - days(day(currentDate))sopm <- currentDate - days(day(currentDate))sopm
<- sopm - days(day(sopm) - 1)#Строим диалоговое окноwin
<- gbasicdialog("BI Data Uploader System v 1.0",visible = F,do.buttons=FALSE)
#Выбор рабочей папки
dirgroup <- gframe("Work directory",container = win,horizontal = T)workdirblock
<- gedit("C:/ppc_bi", container = dirgroup)gbutton("Choice",
container = dirgroup,handler = function(h,...) {workdir <<-
gfile("Select directory",type="selectdir")svalue(workdirblock)
<- workdirsetwd(svalue(workdirblock))})#Группируем учетные данныеcred_group
<- ggroup(container = win)#Учетные даные MySQLmysqlgr
<- gframe("MySQL credentials",container = cred_group,horizontal = F)
glabel("Host:",container = mysqlgr)host <- gedit("", container
= mysqlgr)glabel("User:",container = mysqlgr)user
<- gedit("", container = mysqlgr)glabel("Pass:",container = mysqlgr)pass
<- gedit("", container = mysqlgr)#Учетные данные Googlegagroup
<- gframe("Google credentials",container = cred_group,horizontal
= F)glabel("Clientid:",container = gagroup)clientid <- gedit("",
container = gagroup)glabel("Client secret:",container = gagroup)clientsecret
<- gedit("", container = gagroup)glabel("Adwords API token:",container = gagroup)adwords_api_token
<- gedit("", container = gagroup)#ID докса - справочника проектовdoxgroup
<- gframe("Project dictionary document key",container = win)doxid
<- gedit("", container = doxgroup, width = 50)#Установка отчетного периодаgrperiod
<- gframe("Period",container = win,horizontal = F)glabel("From: ",container = grperiod)date_from
<- gcalendar(text = as.character(sopm), format = "%Y-%m-%d",
container = grperiod)glabel("To: ",container = grperiod)date_to
<- gcalendar(text = as.character(eopm), format = "%Y-%m-%d",
container = grperiod)#Выбор скриптов которые необходимо запуститьgrscripts
<- gframe("Scripts",container = win,horizontal = T)scripts
<- gcheckboxgroup(c("AdWords","Facebook","Direct","QualityScore","LostProfit","Summary"),
container=grscripts)#Кнопка Startgbutton("Start", container = win,handler
= function(h,...) {dispose(win)for(scrnum in svalue(scripts)){
scriptName <- paste0(scrnum, ".R") source(scriptName)}})#Кнопка
Cancelgbutton("Cancel", container = win,handler = function(h,...)
{dispose(win)})#Включаем окноvisible(win, set = T)
Изводи
С помощта на пакета «gWidgets» можете да организирате R-скриптове във вид на десктоп приложения с разбираем интерфейс.
Достъпни са следните графични елементи:
- Диалогов прозорец, в който ще се съдържат всички следващи елементи на интерфейса.
- Бутон с текстов надпис и функция, която ще се изпълнява при натискане.
- Текстов блок, с помощта на който ще можете да обясните предназначението на определени части на интерфейса.
- Текстово поле за въвеждане на данни.
- Списъци с възможност за избор на един или няколко елемента.
- Падащ списък, който позволява по-компактно представяне на списък от достъпни елементи.
- Календар за удобен избор на дати и периоди.
- Диалогов прозорец за избор на папка или файл.
Изброените елементи са достатъчни за създаване на интерфейси, които да опростят работатата със скриптове на езика R.
В тази статия са разгледани най-важните възможности на пакета «gWidgets», но в действителност те са повече. Ако искате да се задълбочите в разработката на потребителски интерфейси на език R, ще са Ви полезни следните материали: