Je me suis lancé dans la création d'une appli shiny (c'est ma première...).
L'idée est que l'utilisateur :
- Choisisse un jeu de paramètres avec différents widgets
- Clique sur un bouton pour lancer les calculs (longs, ce sont des simus)
- Admire le tableau de résultat
- Télécharge un rapport (le tableau de résultat + autres graphes) sous format html
En piochant à droite à gauche j'ai pu me débrouiller, mais pour la génération du rapport je bloque.
Voici mon code (j'ai simplifié au maximum, mais cela reste long...) :
Code : Tout sélectionner
###############################################
### Fonctions nécessaires ###
###############################################
source(file.path(path, "rnorm.R")) ## Je charge les fonctions nécessaires, disons qu'ici on charge la fonction rnorm()
###############################################
### Application shiny ###
###############################################
ui <- fluidPage(
# App title
titlePanel("Stabilité : calcul de puissance"),
# Sidebar layout
sidebarLayout(
# Sidebar
sidebarPanel(
# Input:
numericInput("MOY", "Moyenne", value = 1200, min = 0, step = 0.01),
sliderInput("SD", "Ecart-type", min = 6, max = 15, value = c(8, 10), step = 1),
, width = 3),
# Main panel for displaying outputs
mainPanel(
actionButton(inputId = "SubmitButton",label = " 1. Lancer le calcul", icon("paper-plane"),
style="color: #fff; width: 200px; background-color: #337ab7; border-color: #2e6da4"),
downloadButton("report", " 2. Générer le rapport",),
HTML("<br><br>"), ## Manually add vertical space
# Output: Table summarizing the values entered and the results
tableOutput("values")
, width = 6)
)
)
# Define server logic for slider examples
server <- function(input, output) {
observeEvent(input$SubmitButton, {
# Reactive expression to create data frame of all input values
probaValues <- reactive({
# Create a Progress object
progress <- shiny::Progress$new()
# Make sure it closes when we exit this reactive, even if there's an error
on.exit(progress$close())
progress$set(message = "Calcul en cours :", value = 0, detail = "Jeu de paramètres 1")
## "Traitement" des inputs (Une quizaine en réalité)
MOY <- as.numeric(input$MOY)
SD <- min(as.integer(input$SD)):max(as.integer(input$SD))
## Construction d'un dataframe avec toutes les combinaisons de paramètres
param <- expand.grid(mean = MOY,
sd = SD,
n = 1,
stringsAsFactors = FALSE)
n <- nrow(param)
probas <- numeric(n)
for(i in 1:n){
PARAM <- lapply(param, "[[", i)
probas[i] <- do.call(rnorm, PARAM)
progress$inc(1/n, detail = paste("Jeu de paramètres", i + 1))
Sys.sleep(2) ## Pour admirer ma barre de progression, mais en vrai c'est long
}
data.frame(moyenne = param$mean, ecart = param$sd, proba = probas, check.names=FALSE)
})
# Show the values in an HTML table ----
output$values <- renderTable({
isolate({probaValues()})
}, digits = 3)
})## End of observe event
}
# Create Shiny app ----
shinyApp(ui, server)
Voici ce que j'ai trouvé pour générer le rapport. L'idée est d'afficher output$values ainsi que de créer des graphes avec les résultats de deux-ci
Code : Tout sélectionner
output$report <- downloadHandler(
# For PDF output, change this to "report.pdf"
filename = "report.html",
content = function(file) {
# Copy the report file to a temporary directory before processing it, in
# case we don't have write permissions to the current working dir (which
# can happen when deployed).
tempReport <- file.path(tempdir(), "report.Rmd")
file.copy("report.Rmd", tempReport, overwrite = TRUE)
# Set up parameters to pass to Rmd document
params <- output$values
# Knit the document, passing in the `params` list, and eval it in a
# child of the global environment (this isolates the code in the document
# from the code in this app).
rmarkdown::render(tempReport, output_file = file,
params = params,
envir = new.env(parent = globalenv()))
}
)
Avec un fichier Rmd qui va bien en template.
Pour le moment je n'arrive pas à faire fonctionner la création du rapport car je ne sais pas vraiment où le placer dans monde code.
Est-ce que vous auriez des pistes ?
Merci