(Acest articol a fost publicat pentru prima dată pe Jason Bryerși a contribuit cu drag la R-Bloggers). (Puteți raporta problema despre conținutul de pe această pagină aici)
Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.
tl; dr
Odată login Pachetul este instalat, puteți rula două demo -uri folosind următoarele comenzi:
Rețineți că aceasta este postată încrucișată cu o vinie în login Pachet R. Pentru cea mai actualizată versiune, accesați aici: https://jbryer.github.io/login/articles/paramaters.html Comentarii pot fi direcționate către mine pe mastodon la @jbryer@vis.Social.
Introducere
Shiny este un instrument incredibil pentru analiza interactivă a datelor. Pentru marea majoritate a aplicațiilor strălucitoare pe care le -am dezvoltat, fac o alegere cu privire la starea implicită a aplicației, dar ofer o mulțime de opțiuni pentru utilizator pentru a schimba și/sau personaliza analiza. Cu toate acestea, există situații în care aplicația ar fi mai bună dacă utilizatorul ar fi obligat să introducă anumiți parametri. Conceptual, deseori mă gândesc la aplicații strălucitoare ca la o versiune interactivă a unei funcții, o funcție cu mulți parametri, unii dintre care utilizatorul trebuie să definească parametrii impliciti. Această vinie descrie un modul strălucitor în care un set de parametri trebuie să fie setat înainte ca utilizatorul să se implice cu aplicația principală strălucitoare, iar aceste setări pot fi salvate opțional ca cookie -uri pentru a fi utilizate în sesiuni. Chiar dacă aceasta este principala motivație pentru acest modul strălucitor, acesta poate fi folosit și ca cadru pentru salvarea preferințelor utilizatorului în care starea de economisire a serverului strălucitor nu este posibilă (de exemplu, atunci când este implementat pe www.shinyapps.io).
Modulul de parametri utilizator face parte din login Pachet R. Scopul este de a prezenta utilizatorului un set de parametri într -un dialog modal pe măsură ce aplicația strălucitoare se încarcă. Interfața principală este prin intermediul userParamServer() funcție care poate fi inclusă în codul serverului. Următorul este un exemplu de bază.
params <- userParamServer(
id = 'example',
params = c('name', 'email'),
param_labels = c('Your Name:', 'Email Address:'),
param_types = c('character', 'character'),
intro_message="This is an example application that asks the user for two parameters."),
validator = my_validator
Ca toate modulele strălucitoare, id Parametrul este un identificator unic conectat logica serverului la componentele UI. params Parametrul este un vector de caractere pentru numele parametrilor pe care utilizatorii trebuie să -l introducă. Aceștia sunt singurii doi parametri necesari. În mod implicit, toți parametrii vor presupune că sunt caractere folosind shiny::textInput() funcţie. Cu toate acestea, modulul acceptă mai multe tipuri de intrare, inclusiv:
date– Valorile dateiinteger– Valori întreginumeric– Valori numericefile– Încărcări de fișiere (Rețineți că valoarea va fi calea către locul în care este încărcat fișierul)select– selecția derulantă. Acest tip necesită informații suplimentare în raport cuinput_paramsParametrul discutat din urmă.
Cele de mai sus vor prezenta utilizatorului un dialog modal imediat când aplicația strălucitoare pornește așa cum este descris mai jos.

Valorile pot fi apoi preluate din params obiect, care este descris în figura de mai jos.


userParamServer() Funcția returnează a shiny::reactiveValues() obiect. Drept urmare, orice cod care folosește aceste valori ar trebui să fie actualizat automat dacă valorile se schimbă.
Există două componente UI, în special showParamButton() şi clearParamButton() butoane. Prima va afișa dialogul modal care permite utilizatorului să schimbe valorile. Acesta din urmă va șterge toate valorile setate (inclusiv cookie -urile dacă sunt activate).
Demo strălucitor complet
Cifrele de mai sus sunt din aplicația strălucitoare oferită mai jos.
library(shiny)
library(login)
library(cookies)
#' Simple email validator.
#' @param x string to test.
#' @return TRUE if the string is a valid email address.
is_valid_email <- function(x) {
grepl("\<(A-Z0-9._%+-)+@(A-Z0-9.-)+\.(A-Z){2,}\>", as.character(x), ignore.case=TRUE)
}
#' Custom validator function that also checks if the `email` field is a valid email address.
my_validator <- function(values, types) {
spv <- simple_parameter_validator(values)
if(!is.logical(spv)) {
return(spv)
} else {
if(is_valid_email(values(('email')))) {
return(TRUE)
} else {
return(paste0(values(('email')), ' is not a valid email address.'))
}
}
return(TRUE)
}
ui <- shiny::fluidPage(
cookies::cookie_dependency(), # Necessary to save/get cookies
shiny::titlePanel('Parameter Example'),
shiny::verbatimTextOutput('param_values'),
showParamButton('example'),
clearParamButton('example')
)
server <- function(input, output) {
params <- userParamServer(
id = 'example',
validator = my_validator,
params = c('name', 'email'),
param_labels = c('Your Name:', 'Email Address:'),
param_types = c('character', 'character'),
intro_message="This is an example application that asks the user for two parameters.")
output$param_values <- shiny::renderText({
txt <- character()
for(i in names(params)) {
txt <- paste0(txt, i, ' = ', params((i)), 'n')
}
return(txt)
})
}
shiny::shinyApp(ui = ui, server = server, options = list(port = 2112))
Validare
validator Parametrul SPEICIES O funcție de validare pentru a se asigura că parametrii introduși de utilizator sunt valabili. Valoarea implicită a simple_parameter_validator() Pur și simplu se asigură că au fost introduse valori. Aplicația strălucitoare de mai sus extinde acest lucru verificând, de asemenea, pentru a vedea dacă adresa de e -mail pare să fie valabilă.
Funcțiile de validare trebuie să respecte următoarele:
-
Trebuie să ia doi parametri:
valuescare este un vector de caracter pe care utilizatorul l -a introdus șitypescare este un vector de caracter al tipurilor descrise mai sus. -
Reveni
TRUEDacă ValidaIton trece sau un șir de caractere care descrie de ce validarea a eșuat. Acest mesaj va fi afișat utilizatorului.
Dacă funcția de validare returnează altceva decât TRUE Va fi afișat dialogul modal.
Personalizarea intrărilor strălucitoare
input_params Parametrul permite personalizarea ulterioară a diferitelor intrări strălucitoare. În special, puteți pune pe oricare altul shiny::xxxInput Parametri într -o listă. Pentru select tipuri de intrare choices parametrul este necesar. Următorul șablon oferă structura de bază:
input_params = list(PARAM1 = list(choices = c('Option A', 'Option B')), # When select is the type
PARAM2 = list(min = 0, max = 10, stap = 1)) # When numeric or integer is the type
Exemplu de intrare a fișierului
Următoarea aplicație strălucitoare demonstrează modul de utilizare a funcțiilor de selecție a încărcării fișierelor și a derulant.
library(shiny)
library(login)
library(cookies)
#' Custom validator function that also checks if the `file` field is a valid CSV file.
my_validator <- function(values, types) {
spv <- simple_parameter_validator(values)
if(!is.logical(spv)) {
return(spv)
} else {
if(!file.exists(values$file)) {
return('File does not exists. Try uploading again.')
} else if(!tools::file_ext(values$file) %in% c('csv', 'xslx')) {
return('Only CSV and XLSX files supported.')
}
}
return(TRUE)
}
ui <- shiny::fluidPage(
cookies::cookie_dependency(), # Necessary to save/get cookies
shiny::titlePanel('Data Viewer'),
showParamButton('csvviewer'),
clearParamButton('csvviewer'),
DT::DTOutput('data_table')
)
server <- function(input, output) {
params <- userParamServer(
id = 'csvviewer',
validator = my_validator,
params = c('filetype', 'file'),
param_labels = c('File type', 'URL to a CSV file:'),
input_params = list("filetype" = list("choices" = c("", "CSV" = "csv", "Excel" = "xlsx"))),
param_types = c('select', 'file'),
intro_message="This application will view a spreadsheet as a data table.")
output$data_table <- DT::renderDT({
df <- data.frame()
if(file.exists(params$file)) {
if(params$filetype == 'csv') {
df <- read.csv(params$file)
} else if(params$filetype == 'xlsx') {
df <- readxl::read_excel(params$file)
}
}
return(df)
})
}
shiny::shinyApp(ui = ui, server = server, options = list(port = 2112))
