我正在尝试制作一个闪亮的 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)
对于
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)