【问题标题】:Reset action button output in shiny重置闪亮的动作按钮输出
【发布时间】:2019-06-18 06:24:25
【问题描述】:

我正在使用 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)

【问题讨论】:

标签: r shiny


【解决方案1】:

在下面的回答中,我将演示如何实现您的要求。在我的回答中,我使用 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)

具体解决您的两个问题以及如何解决上述问题:

  1. 要将输入重置为其原始值,我使用shinyjs::reset() 函数。这是一种比将输入更新为特定值更好的方法,因为reset() 函数将保证将其重置为原来的任何值,而您的方法意味着如果您更改 UI 中的初始值,您 必须记得在服务器中更改它。

  2. 为了在按下重置后隐藏结果,我将所有结果 UI 包装在 div(id = "results", ...) 中。然后,每当按下提交按钮时,我都会使用 shinyjs 来显示它,而当按下重置时,我会使用 shinyjs 来隐藏它。我还将 UI 包装在 shinyjs::hidden(...) 中,因为您希望结果一开始没有显示。

以上两种方法都需要在 UI 中调用 shinyjs::useShinyjs()

您应该能够在此示例的基础上构建并在您更复杂的应用中实现这些技术。

另请注意,我上面的示例应用程序在做一些其他事情时与您的不同。例如,您不应该使用output$X &lt;- eventReactive(...)。分配到输出时,您应该使用渲染函数(例如renderText())。

【讨论】:

    【解决方案2】:

    对于有同样问题的人,这也可能是一个解决方案:Restart Shiny Session。这样一来,所有的输入和输出都会被重置,但是需要更多的时间。

    【讨论】:

      猜你喜欢
      • 2020-08-12
      • 2018-03-13
      • 1970-01-01
      • 2018-02-20
      • 2018-11-27
      • 1970-01-01
      • 2021-07-11
      • 2014-08-07
      • 2019-07-15
      相关资源
      最近更新 更多