在选项卡中输入密码后如何获取新的文本输入?

问题描述 投票:0回答:1

我正在尝试制作一个闪亮的 R 应用程序,人们需要在其中回答谜语(raadsel)。当他们得到正确答案时,会出现一个弹出窗口,表明他们有正确答案,并在主面板中出现一个恭喜的句子,在第二个选项卡中填写密码:jouwwachtword。他们必须在第二个选项卡中输入该密码,才能获得新的文本输入,他们必须在其中填写自己的姓名。第一部分有效,但是当我转到第二个选项卡并填写密码时,没有任何反应。下面我有我的代码,但我看不出哪里出了问题。

library(shiny)

# Definieer raadsels en antwoorden
raadsels <- c("Ik ben groot als ik jong ben, maar klein als ik oud ben. Wat ben ik?", 
              "Ik ben altijd om je heen, maar nooit gezien. Wat ben ik?")
antwoorden <- c("een boom", "lucht")

# UI voor de spiegel
ui <- fluidPage(
  titlePanel("Interactieve Spiegel"),
  tabsetPanel(
    tabPanel("Raadsel",
             sidebarLayout(
               sidebarPanel(
                 textInput("antwoord", "Wat is je antwoord?"),
                 actionButton("controleer", "Controleer Antwoord")
               ),
               mainPanel(
                 verbatimTextOutput("raadsel_output"),
                 verbatimTextOutput("feedback")
               )
             )
    ),
    tabPanel("Naam en Document",
             sidebarLayout(
               sidebarPanel(
                 conditionalPanel(
                   condition = "!input.wachtwoord_ingevuld",
                   passwordInput("wachtwoord", "Voer het wachtwoord in:"),
                   actionButton("ontgrendel", "Ontgrendel")
                 ),
                 conditionalPanel(
                   condition = "input.wachtwoord_ingevuld",
                   textInput("naam", "Vul je naam in:"),
                   actionButton("bevestig_naam", "Bevestig Naam"),
                   downloadButton("download_doc", "Open Document")
                 )
               ),
               mainPanel(
                 verbatimTextOutput("document_output")
               )
             )
    )
  )
)

# Server logica
server <- function(input, output, session) {
  
  wachtwoord_ingevuld <- reactiveVal(FALSE)
  correct_antwoord_gegeven <- reactiveVal(FALSE)
  
  output$raadsel_output <- renderText({
    raadsels[1]  # Weergeef het eerste raadsel
  })
  
  output$feedback <- renderText({
    if (correct_antwoord_gegeven()) {
      "Gefeliciteerd! Voer het wachtwoord in om verder te gaan."
    } else {
      ""
    }
  })
  
  observeEvent(input$controleer, {
    antwoord <- tolower(input$antwoord)  # Antwoorden zijn niet hoofdlettergevoelig
    
    if (antwoord %in% tolower(antwoorden)) {
      showModal(
        modalDialog(
          title = "Goed Geraden!",
          "Jullie mogen de envelop openen."
        )
      )
      correct_antwoord_gegeven(TRUE)
    } else {
      showModal(
        modalDialog(
          title = "Fout Antwoord",
          "Het antwoord is niet correct. Probeer het opnieuw."
        )
      )
    }
  })
  
  observe({
    if (correct_antwoord_gegeven() && input$wachtwoord == "jouwwachtwoord") {
      wachtwoord_ingevuld(TRUE)
    }
  })
  
  observeEvent(input$bevestig_naam, {
    if (input$naam != "") {
      showModal(
        modalDialog(
          title = "Gefeliciteerd!",
          paste("Bedankt,", input$naam, "! Klik op 'Open Document' om uw document te downloaden.")
        )
      )
    } else {
      showModal(
        modalDialog(
          title = "Fout",
          "Voer alstublieft uw naam in."
        )
      )
    }
  })
  
  output$document_output <- renderText({
    if (wachtwoord_ingevuld() || correct_antwoord_gegeven()) {
      paste("Dit is het document voor", input$naam)
    } else {
      ""
    }
  })
}

# Run de app
shinyApp(ui = ui, server = server)

r text shiny tabs passwords
1个回答
0
投票

对于

conditionalPanel
,您使用的是依赖于
condition
input.wachtwoord_ingevuld
。但是,
wachtwoord_ingevuld
是您在
output
侧计算的
server
值,而不是
input
值。

因此,您必须使用

output.wachtwoord_ingevuld
重写代码,请参阅下面的示例,该示例有效。

library(shiny)

# Definieer raadsels en antwoorden
raadsels <- c("Ik ben groot als ik jong ben, maar klein als ik oud ben. Wat ben ik?", 
              "Ik ben altijd om je heen, maar nooit gezien. Wat ben ik?")
antwoorden <- c("een boom", "lucht")

# UI voor de spiegel
ui <- fluidPage(
  titlePanel("Interactieve Spiegel"),
  tabsetPanel(
    tabPanel("Raadsel",
             sidebarLayout(
               sidebarPanel(
                 textInput("antwoord", "Wat is je antwoord?"),
                 actionButton("controleer", "Controleer Antwoord")
               ),
               mainPanel(
                 verbatimTextOutput("raadsel_output"),
                 verbatimTextOutput("feedback")
               )
             )
    ),
    tabPanel("Naam en Document",
             sidebarLayout(
               sidebarPanel(
                 conditionalPanel(
                   condition = "!output.wachtwoord_ingevuld",
                   passwordInput("wachtwoord", "Voer het wachtwoord in:"),
                   actionButton("ontgrendel", "Ontgrendel")
                 ),
                 conditionalPanel(
                   condition = "output.wachtwoord_ingevuld",
                   textInput("naam", "Vul je naam in:"),
                   actionButton("bevestig_naam", "Bevestig Naam"),
                   downloadButton("download_doc", "Open Document")
                 )
               ),
               mainPanel(
                 verbatimTextOutput("document_output_text")
               )
             )
    )
  )
)

# Server logica
server <- function(input, output, session) {
  
  #wachtwoord_ingevuld <- reactiveVal(FALSE)
  correct_antwoord_gegeven <- reactiveVal(FALSE)
  
  output$raadsel_output <- renderText({
    raadsels[1]  # Weergeef het eerste raadsel
  })
  
  output$feedback <- renderText({
    if (correct_antwoord_gegeven()) {
      "Gefeliciteerd! Voer het wachtwoord in om verder te gaan."
    } else {
      ""
    }
  })
  
  observeEvent(input$controleer, {
    antwoord <- tolower(input$antwoord)  # Antwoorden zijn niet hoofdlettergevoelig
    
    if (antwoord %in% tolower(antwoorden)) {
      showModal(
        modalDialog(
          title = "Goed Geraden!",
          "Jullie mogen de envelop openen."
        )
      )
      correct_antwoord_gegeven(TRUE)
    } else {
      showModal(
        modalDialog(
          title = "Fout Antwoord",
          "Het antwoord is niet correct. Probeer het opnieuw."
        )
      )
    }
  })
  
  output$wachtwoord_ingevuld <- reactive({
    if (correct_antwoord_gegeven() && input$wachtwoord == "jouwwachtwoord") {
      TRUE
    } else {
      FALSE
    }
  })
  
  observeEvent(input$bevestig_naam, {
    if (input$naam != "") {
      showModal(
        modalDialog(
          title = "Gefeliciteerd!",
          paste("Bedankt,", input$naam, "! Klik op 'Open Document' om uw document te downloaden.")
        )
      )
    } else {
      showModal(
        modalDialog(
          title = "Fout",
          "Voer alstublieft uw naam in."
        )
      )
    }
  })
  
  document_output <- reactive({
    if (correct_antwoord_gegeven() || input$wachtwoord == "jouwwachtwoord") {
      paste("Dit is het document voor", input$naam)
    } else {
      ""
    }
  })
  
  output$document_output_text <- renderText({
    print(document_output())
  })
  
  outputOptions(output, "wachtwoord_ingevuld", suspendWhenHidden = FALSE)
}

# Run de app
shinyApp(ui = ui, server = server)
© www.soinside.com 2019 - 2024. All rights reserved.