我正在使用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)
答案 0 :(得分:0)
在下面的回答中,我将演示如何实现您的要求。在我的回答中,我使用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)
要专门解决您的两个问题以及以上这些问题的解决方法,
要将输入重置为原始值,我使用了shinyjs::reset()
函数。与将输入更新为特定值相比,这是一种更好的方法,因为reset()
函数将保证将其重置为原始值,而您的方法意味着,如果您更改UI中的初始值,您必须也记得在服务器中进行更改。
要在按下reset键后隐藏结果,我将所有结果UI包装在div(id = "results", ...)
中。然后,每当按下“提交”按钮时,我都会使用Shinyjs来显示它,当按下重置按钮时,我会使用Shinyjs来隐藏它。我也将UI封装在shinyjs::hidden(...)
中,因为您希望结果以未显示开始。
以上两项均需要在用户界面中调用shinyjs::useShinyjs()
。
您应该能够构建此示例,并在更复杂的应用程序中实现这些技术。
还要注意,我上面的示例应用程序所做的其他一些事情与您的有所不同。例如,您不应使用output$X <- eventReactive(...)
。分配给输出时,应使用渲染功能(例如renderText()
)。
答案 1 :(得分:0)
对于有相同问题的人,这也可能是一种解决方案:Restart Shiny Session。这样,所有输入和输出都将重置,但是需要更多时间。