我正在使用 R Shiny 开发预测模型。
我输入了模型的一些变量,例如性别、年龄、身高......然后我有一个操作按钮,上面写着“生成预测”。
按下时,会根据输入变量的预测出现一些文本和图形。
我还添加了一个“重置”操作按钮。
我希望当按下此按钮时所有变量都变为原始值(已经有效)并且“生成预测”按钮后生成的输出消失。
我的问题是这个愿望的第二部分。
是否可能以及如何在按“重置”后删除输出?
下面以我的脚本为例(真实的脚本更复杂)。我希望在按下重置时“预测结果”中的部分消失。
library(shiny)
# Define UI ----
ui <- fluidPage(
titlePanel(title=div( "COPD risk prediction tool")),
p("Chronic Obstructive Pulmonary Disease (COPD) is a lung problem that can affect people mainly as they get older. One of the main features of COPD is a change in the airways that alters how the air is held in the lungs and the ease with which breathing occurs (the airways become 'obstructed'). This may cause breathlessness, frequent coughing, production of sputum from your chest, and chest infections."),
selectInput("sex", label=h4("What is your gender?"),
choices=list("Female"=0, "Male"=1), selected=0),
selectInput("age", label=h4("What is your age?"),
choices=list("18"=18, "19"=19, "20"=20, "21"=21, "22"=22, "23"=23, "24"=24, "25"=25, "26"=26, "27"=27, "28"=28, "29"=29, "30"=30), selected=20),
bsTooltip("age",
"What is your current age in years?","right"),
selectInput("weight", label=h4("What is your weight?"),
choices=list("50"=50, "51"=51, "52"=52, "53"=53, "54"=54, "55"=55, "56"=56, "57"=57, "58"=58, "59"=59, "60"=60, "61"=61, "62"=62, "63"=63, "64"=64, "65"=65, "66"=66, "67"=67, "68"=68, "69"=69, "70"=70, "71"=71, "72"=72, "73"=73, "74"=74, "75"=75, "76"=76, "77"=77, "78"=78, "79"=79, "80"=80, "81"=81, "82"=82, "83"=83, "84"=84, "85"=85, "86"=86, "87"=87, "88"=88, "89"=89, "90"=90, "91"=91, "92"=92, "93"=93, "94"=94, "95"=95, "96"=96, "97"=97, "98"=98, "99"=99, "100"=100), selected=75),
bsTooltip("weight",
"What is your current weight in kg?", "right"),
selectInput("height", label=h4("What is your height?"),
choices=list("140"=140, "141"=141, "142"=142, "143"=143, "144"=144, "145"=145, "146"=146, "147"=147, "148"=148, "149"=149, "150"=150, "151"=151, "152"=152, "153"=153, "154"=154, "155"=155, "156"=156, "157"=157, "158"=158, "159"=159, "160"=160, "161"=161, "162"=162, "163"=163, "164"=164, "165"=165, "166"=166, "167"=167, "168"=168, "169"=169, "170"=170, "171"=171, "172"=172, "173"=173, "174"=174, "175"=175, "176"=176, "177"=177, "178"=178, "179"=179, "180"=180, "181"=181, "182"=182, "183"=183, "184"=184, "185"=185), selected=170),
bsTooltip("height",
"What is your current height in cm?", "right"),
br(),
h4("Medical Disclaimer", style = "color:blue"),
p(strong("This risk prediction tool is for general information and should not replace advice from your GP who knows your individual history.", style = "color:blue")),
p(strong("Although we have included major risk factors, COPD can affect anyone and if you have symptoms or concerns you should speak to your doctor.", style = "color:blue")),
p(strong("This risk score is derived from Caucasian populations and may not be as accurate for other ethnic groups.", style = "color:blue")),
actionButton("submit", label = "Generate Prediction"), actionButton("reset", label=("Reset")),
h2(textOutput('title')),
h4(textOutput('label1')),
h5(textOutput('label2')),
verbatimTextOutput("prediction")
)
# Define server logic ----
server <- function(input, output,session) {
submit <- FALSE
output$title <- eventReactive(input$submit, {
'Results of prediction'
})
output$label1 <- eventReactive(input$submit, {
'COPD risk prediction score'
})
output$label2 <- eventReactive(input$submit, {
'Your predicted risk (%) of developing COPD in your lifetime is:'
})
output$prediction <- eventReactive(input$submit, {
round((copdRisk(weight=input$weight, height=input$height, sex=input$sex)*100), 1)
})
output$label5 <- eventReactive(input$submit, {
'This means that for every 100 people sharing your characteristics '
})
output$label6 <- eventReactive(input$submit, {
'would develop COPD in their lifetime.'
})
observe({
input$reset
updateSelectInput(session, "age", selected=20)
updateSelectInput(session, "weight", selected=75)
updateSelectInput(session, "height", selected=170)
updateSelectInput(session, "sex", selected=0)
#updateActionButton(session, "submit", selected=FALSE)
})
}
# Run the app ----
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)
在下面的回答中,我将演示如何实现您的要求。在我的回答中,我使用该shinyjs包来重置输入值和隐藏/显示结果。我无法运行您的代码,因为您正在使用一些我不知道的额外包和函数,并且代码本身不是一个最小的孤立示例,所以我将编写自己的小应用程序,它可以执行类似的操作,并且达到你想要的。这是代码:
library(shiny)
ui <- fluidPage(
shinyjs::useShinyjs(),
numericInput("num", "Enter a number", 7),
actionButton("submit", "Square that number!"),
actionButton("reset", "Reset"),
shinyjs::hidden(
div(
id = "results",
h3("The square is"),
textOutput("square")
)
)
)
server <- function(input, output, session) {
output$square <- renderText({
input$submit
isolate(input$num * input$num)
})
observeEvent(input$reset, {
shinyjs::reset("num")
shinyjs::hide("results")
})
observeEvent(input$submit, {
shinyjs::show("results")
})
}
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)
具体解决您的两个问题以及上面如何解决它们:
要将输入重置为其原始值,我使用该shinyjs::reset()函数。这是比将输入更新为特定值更好的方法,因为该reset()函数将保证将其重置为最初的值,而您的方法意味着如果您更改 UI 中的初始值,则必须记住更改它也在服务器中。
为了在按下重置后隐藏结果,我将所有结果 UI 包装在一个div(id = "results", ...). 然后,每当按下提交按钮时,我都会使用shinyjs来显示它,当按下重置时,我会使用shinyjs来隐藏它。我还将 UI 封装在 a 中,shinyjs::hidden(...)因为您希望结果一开始不显示。
shinyjs::useShinyjs()上述两者都需要在 UI 中调用。
您应该能够构建此示例并在更复杂的应用程序中实现这些技术。
另请注意,我上面的示例应用程序执行的其他一些操作与您的不同。例如,您不应该使用output$X <- eventReactive(...). renderText()在分配到输出时,您应该使用渲染函数(例如)。
| 归档时间: |
|
| 查看次数: |
4469 次 |
| 最近记录: |