The goal is to have a shiny module ui1.R
that loads a second module ui2.R
when the button confirm
is clicked. I think the issue is that is.null(input$confirm)
is always invalidated. What I need instead, is to invalidate the expression only once confirm
is clicked.
The question is very close to Starting Shiny app after password input, but I am trying to modularize the solution.
ui.R
library(shiny)
library(shinyjs)
htmlOutput("page")
server.R
rm(list = ls())
library(shiny)
library(dplyr)
library(shinyjs)
Logged <- FALSE
shinyServer(function(input, output) {
source('ui1.R') #login page
source('ui2.R')
observeEvent(!is.null(input$confirm), {
Logged <<- T
})
observe({
if (Logged == FALSE) {
output$page <- renderUI({
ui1Output('ui1Output')
})
output$lsuId <- renderText({ input$lsuId })
}
if (Logged == TRUE)
{
output$page <- renderUI({ ui2 })
}
})
callModule(ui1,'ui1')
})
ui1.R
library(shinyjs)
ui1Output <- function(id, label = "ui1") {
ns <- NS(id)
shinyUI(fluidPage(
useShinyjs(),
titlePanel("Form"),
div(textInput(ns("lsuId"), "This has to be filled", ""),
actionButton(ns("confirm"), "Submit", class = "btn-primary")
)
))
}
ui1 <- function(input, output, session) {
observe({
LSUID <- reactive({ input$lsuId })
shinyjs::toggleState(id = "confirm", condition = LSUID())
})
}
ui2.R
ui2<- shinyUI(fluidPage(
div("well done!")
))
global.R
source('ui1.R') #login page
source('ui2.R')
Manual steps to build authentication page. Username : myuser Password : mypass Username : myuser1 Password : mypass1 . To change them, you can edit the following code in R program. In order to modify sidebar section, you can edit the following section of code.
Shiny is an R package that makes it easy to build interactive web apps straight from R. You can host standalone apps on a webpage or embed them in R Markdown documents or build dashboards. You can also extend your Shiny apps with CSS themes, htmlwidgets, and JavaScript actions.
The easiest way to turn your Shiny app into a web page is to use shinyapps.io, RStudio's hosting service for Shiny apps. shinyapps.io lets you upload your app straight from your R session to a server hosted by RStudio. You have complete control over your app including server administration tools.
I think you have two issues here:
First your confirm button value is stored here: input$"ui1Output-confirm"
and not here: input$confirm
I would suggest to replace:
observeEvent(is.null(input$confirm), {
Logged <<- F
})
By:
observeEvent(input$"ui1Output-confirm", {
Logged <<- T
})
Then your observe function does not contain any reference to the button so it is not executed when the user clicks on it. I don't have a proper solution for this but a simple hack would be to add:
tmp <- input$"ui1Output-confirm"
at the begining of the observe section:
observe({
tmp <- input$"ui1Output-confirm"
if (Logged == FALSE) {
output$page <- renderUI({
ui1Output('ui1Output')
})
output$lsuId <- renderText({ input$lsuId })
}
if (Logged == TRUE)
{
output$page <- renderUI({ ui2 })
}
})
Here is my solution. It is not perfect but it is simple.
library(shiny)
ui <- fluidPage(
conditionalPanel(
condition = "input.password != 'password'",
textInput("password", "Password:", value = "Type the password here")
),
conditionalPanel(
condition = "input.password == 'password'",
fluidRow(
column(2,
textInput("Green", "Green:", value = "24716"),
textInput("Blue", "Blue:", value = "24700")
)
)
),
plotOutput(outputId = "distPlot")
)
server <- function(input, output, session) {
output$distPlot <- renderPlot({
if (input$password!="password") return(0)
plot(c(1,2,3),c(1,2,3))
})
}
app=shinyApp(ui, server)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With