Tableau de bord
library(shiny)
library(shinydashboard)
ui <- fluidPage(
interface
)
server <- function(input, output) {
contenu
}
#executer l'application
shinyApp(ui = ui, server = server)
page_fillable(...)
page qui occupe tout l'écran.page_fluid(...)
page scrollable.
Eléments d'interface
Note
Le contenu non modifiable est basé sur les balises html.
Code | Type |
---|---|
p("texte simple) |
Texte simple. |
h1("titre 1") |
Titre de hiéarchie 1. |
Saisie
type(inputId = id, ....)
input$id
récuperer l'entré. Utile notamment dans la partie server.
Les différentes méthodes pour :
Option :
inputId = id
id qui permet de récupérer la valeur.label = 'titre'
texte a afficher.
Les méthodes :
actionButton("id",...)
bouton.checkboxInput("id",...)
liste à cocher à un seul élément.-
checkboxGroupInput("id",...)
liste à cocher à plusieurs éléments. Il y a la possibilité de màj des valeurs avecupdateCheckboxGroupInput
.inline = T
sur la même ligne.choices = c()
liste des valeurs et libellés à afficher (ouchoiceNames
etchoiceValues
).
-
dateInput()
calendrier de saisi de date. dateRangeInput()
calendrier avec période.-
fileInput(nomFicher, text, multiple = FALSE)
importer un fichier. Paramètres du :$name
nom du fichier.$datapath
chemin du fichier.$size
taille en octets.
-
numericInput()
valeur numérique. paswordInput()
colourInput()
(packagecolourpicker
)radioButtons()
sliderInput()
barre de défilement.textInput()
petite zone de saisie textuelle.textAreaInput()
grande zone de saisie de texte.
Les listes selectionnbles
selectInput(choices = liste)
liste à choix multiples (liste de liste pour avoir des groupes).varSelectizeInput()
sélectionner les colonnes d'un df.updateSelectInput(session, id, choices = c("A", "B"), selected = "A")
mettre a jour un select (dans leserver
).
Paramètres :
multiple = TRUE
autoriser de multiples saisies.
Interface
Il existe deux princiapaux packages pour l'interface sont :
shinydashboardplus
le package le plus populaire.bslib
qui s'appuie sur bootstrap et qui est plus moderne que shynidashboard.
Shinydashboardplus
library(shinydashboardPlus)
Panneau de saisie
mainPanel()
principale.sidebarPanel()
saisie.
Les boîtes :
box(title = "New",
fluidRow(
column(width=4, objet),
column(width=4, objet)
)
)
sidebarMenu(menuItem(text = "onglet", tabName = "onglet"))
ajouter dans le menu.-
tabItems(tabName = onglet, contenuOnglet))
ajouter dans le corps. Paramètres :badgeLabel = nom, badgeColor = couleur
Ajouter un badgedisable = TRUE
desactiver la barre.
Paramètres :
title = titre
titrer l'application-
skin = couleur
thème utilisé. -
dashboardHeader(title = "titre", titleWidth = largeur)
entête. dashboardSidebar(width = largeur, title = titre)
menu à gauche.dashboardBody()
corps de la page.
Bootstrap
library(bslib)
Example
Exemple de tableau de bord chicago flights.
Structure de la page
-
hr()
ajouter une ligne horizontale. -
layout_columns(...)
créer une ligne avec 12 colonnes responsives. Paramètres : -
col_widths =
largeur de chaque colonne (max = 12). Ex :c(2,5,5)
. style = css(grid_template_columns = "5fr 3fr")
pour avoir des éléments avec des tailles différentes.-
row_heights =
hauteurs. -
layout_column_wrap()
colonnes avec retour à la ligne des éléments lorsque la taille est insuffisante. -
page_fillable(...)
remplir l'ensemble de la page. -
page_navbar(titre, ...)
barre horizontal en haut. Elements ajouter :title = "PKE"
footer =
-
nav_panel(titre, contenu)
ajouter un ongler nav_menu(titre, nav_item("ele1"), nav_item("ele2"))
ajouter une liste avec les onglets.nav_spacer()
espace dans le menu.
Options :
-
underline = T
souligner l'onglet actuel. -
page_sidebar(...)
menu à gauche. -
sidebar = sidebar(...)
ajouter des élements au menu.
Note
Il faut ajouter page_X(fluidPage(...))
pour pouvoir interagir avec les DT.
layout_sidebar()
ajouter le menu à gauche.
style = css(grid_template_columns = "2fr 1fr")
largeur des relatives des éléments.
Les cartes
card(...)
card_header("Datatable loaded")
entêtecard_header("Datatable loaded")
titre.card_body()
corps.card_footer()
pied de page.
Paramètres :
full_screen = T
autoriser la mise en pleine écran.class = "class boostrap"
ajouter une classe bootstrap (exemplebg-light
).
value_box(
title = "I got",
value = "99 problems",
showcase = bs_icon("music-note-beamed"),
p("bslib ain't one", bs_icon("emoji-smile")),
p("hit me", bs_icon("suit-spade"))
)
Accordéon
-
accordion(accordion_panel(...))
Menu en accordéons. Paramètres : -
open = T ou id
panneau ouvert par défaut. -
accordion_panel(title, "les éléments", value = title, icon = NULL)
ajouter un panneau.
Icônes
library(bsicons)
basée sur les icones bootstrap
bs_icon("music-note-beamed")
ajouter un icone.
Eléments d'interface
fluidRow(contenu)
Code | Type |
---|---|
br() |
saut de ligne |
hr() |
ligne horizontale |
box() |
classique |
infoBox() |
texte statique |
tabBox() |
valeur |
valueBox() |
valeur dynamique |
modalDialog() |
fenêtre pop up (ajouter un bouton modalButton("Dismiss") ) |
HTML("## markdown") |
afficher du code html. |
renderMarkdown(fichier) |
afficher du texte markdown (library(markdown) ). |
showModal(modalDialog("Test"))
Boîte avec un tableau. Arguments :
title = titre
footer = pied de la page
width = largeur
color = couleur
Example
Table box
tabBox(
title = titre,
tabPanel(title = "titre", tableOutput("nomTable"))
)
Note
Pour rendre une valeur dynamique avec valueBox sur server.
output$nom <- renderValueBox({
valueBox(a completer)
})
Server
server <- function(input, output) {
output$nom <- resultat
}
Note
Pensez à isoler une processus avec isolate()
pour continuer à utliser l'application même lorsque des traitements sont en cours.
Les sorties doivent être stockées dans la variable
code server | rendu | code ui |
---|---|---|
renderText({texte}) |
texte | textOutput('variable') , htmlOutput("id") |
renderPrint(variable) |
variable | |
renderPlot({graphique}) |
graphique | plotOutput('variable') |
renderTable({tableau}) |
tableau | tableOutput('variable') |
renderPlotly({graphique}) |
données | plotlyOutput('variable') |
renderUI("summary") |
html et dans server | uiOutput(id) |
tagAppendAttributes(style= 'color:green;')
ajouter un attribut.
Note
rendrUI
doit contenir du code comme celui présent dans UI (fonction de type xxxOutput). On utilise généralement un tagList
et les idenfiants
sont appelés avec ns("")
.
DataFrame
DT
library(DT)
-
renderDT()
server (à éviterrenderDataTable({dataFrame})
). Paramètres :editable = TRUE
rendre la table éditable.filter = list(position = 'top', clear = FALSE)
filtrer chaque colonne.
-
datatable(df)
rownames= FALSE
cacher le nom des lignes.-
options = list(...)
scrollX = TRUE
scrollable.autoWidth = T
prendre toute la largeur.dom = 't'
cacher la barre de recherche.
-
selection = "single"/"multiple/none"
doesn't work withlist()
:target=row/column/cell
définir le type de sélection.selected = matrix(c(1, 3, 2, 4), nrow = 2, ncol = 2)
préselectionner des cellules (matrice à deux colonnes).
-
DTOutput()
(à éviterdataTableOutput('variable')
). Paramètres :
Valeurs récupérables à partir d'un dataframe :
Par exemple, avec target = 'cell'
, les valeurs sont présentes dans input$id_table
+ _cells_selected
.
- id_table +
_row_last
- id_table +
_cell_clicked
- id_table +
_last_clicked
- id_table +
_selected
observeEvent(input$table1_cell_edit, {
row <- input$table1_cell_edit$row
clmn <- input$table1_cell_edit$col
rv$data[row, clmn] <- input$table1_cell_edit$value
})
Reactable
library(reactable)
-
reactable(dataframe)
créer un reactable. Paramètres : -
bordered = T
bordures. highlight = T
afficher un fond sur la ligne ou se trouve la souris.selection = "multiple"
sélectionner des lignes.defaultSelected = c(1)
ajouter une sélection par défaut.onClick = "select"
sélectionner une ligne au click.filterable = TRUE
zone de recherche pour chaque colonne.searchable = TRUE
zone de recherche unique.- Créer des groupes de colonnes :
columnGroups = list(
colGroup("Subject id", columns = grp_label_subject_id),
colGroup("Statistics", columns = grp_label_statistics)
)
resizable = T
colonne redimensionable.rownames = T
afficher le nom des lignes.
Note
selection = "multiple"
et onClick = "select"
pour ajouter une colonne de checkboxes.
renderReactable({reactable(iris)})
reactableOutput("table")
getReactableState("tab_pk", "selected")
renvoie tous les numéros des lignes sélectionnées.
colonne = colDef()
name = "Sepal Length"
nom de la colonne à affichershow = T
afficher la colonne.
Colorer les cellules library(reactablefmtr)
are option for reactable()
-
columns = list()
colorer une colonne en fonction des valeurs. -
colonne = colDef(style = color_scales(data, color_by = 'colonne'))
colorer la colonne en fonction des valeurs.colors = c("#f0f0f0", "#519de9")
personnaliser les couleurs utilisées.
Ajouter des paramètres de modifications library(reactable.extras)
columns = list(
unit_to = colDef(cell = text_extra("text"))
)
text_extra("text")
zone de texte libre.dropdown_extra(id = "dropdown", vecteur, class = "dropdown-extra")
liste à choix.
Download file
downloadButton(outputId = "download_kluster", label = "Kluster export")
bouton de téléchargement d'un fichier dans UI.
Code du server :
output$downloadBPR <- downloadHandler(
filename = function(){nom_fichier},
content = function(file){file.copy(paste0(workDir, "BPR.xlsx"), file)
}
)
shinyjs::runjs("$('#download_summary')[0].click();")
télécharger sans utiliser le bouton.download.
Variable réactive
Deux manières de rendre un objet réactif :
- une entrée : ...Input
- une sortie : ...Ouput ou output$...
- les deux : reactive()
variable = reactive({
return(valeur)
})
créer une variable réactive celle ci à les mêmes propriétés qu'une fonction.
variable()
utiliser une variable réactive qui n'est pas modifiable.-
eventReactive(input$action, {variable})
réactive variable à la suite d'un évènement. Paramètres : -
ignoreNULL = T
déclencher le calcul uniquement si la valeur n'est pas nulle. ignoreInit = F
déclencher le calcul uniquement si la variable réactive existe.
Note
Lorsqu'il y a plusieurs filtres il est préférable d'utiliser un bouton pour déclencher le calcul.
Contexte réactif
reactiveValues()
créer une variable réactive modifiable. La variable créée est une liste.observe({r$data <- input$data})
déclarer un contexte réactif. L'instruction est lue dès le lancement de l'application.observeEvent(input$bouton, {...})
mettre à jour des instructions en fonction d'un événement.
Warning
reactiveValues()
fonctionne avec observeEvent et non pas avec eventReactive.
Note
Possibilité de définir des output$...
au sein du contexte.
{input$submit1, input$submit2}
si aucun élément n'est NULL.c(input$submit1, input$submit2)
au moins un des éléments n'est pas nul.
Liste interactive utilisant une variable réactive
ui :
uiOutput("interaction_slider")
Server :
filterGenre <- reactive(genre)
output$interaction_slider <- renderUI({
selectInput("select", label = "Select box",
choices = as.list(genre)$genre_label, selected = 1)})
- Créer une variable réactive
r <- reactiveValues()
dans le fichier server. - Màj de la valeur
observe({r$data <- input$dt_kluster})
. - Déclarer la variable réactive dans le module :
mod_nom_ui <- function(id){
ns <- NS(id)
tagList(
element1(ns("id1")),
element2(ns("id2"))
)
}
mod_nom_server <- function(id, r){
moduleServer(id, function(input, output, session){
ns <- session$ns # parfois utiles
code server
}
}
- Appeler le module dans la partie server
mod_example_server("example_1", r = r)
.
Warning
ns("id_output/id_input")
pour appeler une sortie utiliser les fonctions qui renvoie les identifiants.
Blog avec un bon article sur les variables réactives.
req(variable)
le code est stopé si les variables requises ne sont pas disponibles.
eventReact()
ignoreNULL = FALSE
ne déclenche pas le calcul si l'élément est Null.
Datamods
Shinyapps
library(rsconnect)
- Découper le projet en deux fichiers : server.R et ui.R.
- Générer un jeton depuis le site shinyapps : Token.
Données sessions
session$clientData$url_protocol
session$ns
récupérer l'identifiant de session.
Insérer fichier
ui = htmlTemplate(filename = "page.html", sortie1, entree1)
insérer un html.includeMarkdown("fichier.md")
insérer un fichier markdown (library(htmltools)
).
Flexdashboard
Flexdasboard permet de créer des tableaux de bord site web dynamique à partir d'un fichie Rmarkdown. L'avantage principal est qu'il est facile à exporter dans un seul fichier.
library(flexdashboard)
output:
theme: theme
Theme | Couleur | Commentaire |
---|---|---|
default | bleu | |
bootstrap | gris blanc | |
cerulean | bleu relief | |
journal | saumon | New time roman |
flatly | vert turquoise | |
readable | blanc | |
spacelab | bleu blanc relief | |
united | bordeau | |
lumen | blanc | |
paper | bleu | ++ |
sandstone | vert moche | |
simplex | rouge | |
yeti | bleu |
runtime: shiny
intégrer du code shiny (nécessite un server shiny).
Ajouter une box et des onglets
Column {data-width=600}` préciser la largeur de la colonne.
-------------------------------------
Page 4 {data-navmenu="Menu B"}
=====================================
.tabset .tabset-fade
ajouter des onglets à une box.
Valeur box
valueBox(comments, icon = "fa-comments")
ajouter une valeur box.
Barre de progression et animations de chargement
withProgress(message = 'Compute parameters PK', style = "notification", value = 0, {
# incProgress(percentage_by_group, detail = paste("Group", name_grp))
})
shinycssloaders::withSpinner(ui)
animation de chargement d'un élément.