Je me lance enfin dans Shiny et je souhaite créer une fonction qui sera utilisée dans ui et dans server afin de créer un module shiny. Après de multiples essais je ne parviens pas faire fonctionner observeEvent() dans la partie server.
En faisant une fonction pour ui et une autre fonction pour server, je parviens à faire ce que je veux, mais je souhaiterai grouper les deux dans une seule et même fonction.
Voici le code reproductible explicitant mon problème :
Code : Tout sélectionner
require(shiny)
module <- function(id, where=c("server", "ui"), button, input, output, session) {
result <- NULL
ns <- NS(id)
# UI part ---------------------------------------------------------------------
if(where=="ui") {
result <- tagList(
tags$h4("Title"),
textInput(ns("module_text"), label="Write text"),
actionButton(ns("module_button"), label="Launch"),
verbatimTextOutput(ns("module_verbatim"))
)
}
# SERVER part -----------------------------------------------------------------
if(where=="server") {
result <- observeEvent(eventExpr=button(), handlerExpr={
output$module_verbatim <- input$module_text
cat("verbatim updated")
})
}
return(result)
}
ui <- fluidPage(
tags$h1("Avant le module"),
module(id="test", where="ui"),
tags$h1("Après le module")
)
server <- function(input, output, session) {
callModule(module, id="test", where="server", button=reactive(input$module_button))
}
shinyApp(ui, server)
Avec ce code, l'app marche mais lorsqu'on écrit quelque chose dans la zone de texte et qu'on clique sur le boutton, rien ne se passe alors que le verbatimTextOutput() devrait s'afficher ainsi que le cat().
Avez-vous des suggestions ?
N'hésitez pas à critiquer le code et/ou la logique, je n'ai pas encore comblé toutes mes lacunes en Shiny et toute aide est la bienvenue !
Merci,
Bastien