闪亮 - 在Ui.R

时间:2017-10-13 15:02:14

标签: r shiny

我有一个应用程序,它有很多输入,并使用actionButton()进行一些计算,这需要花费很多时间,包括读取一些文件和绘制地图。

在某些用户测试期间,调整输入后需要重新按actionButton()的一些反馈是非直观的。我想提示一条警告信息(阅读"有用的提示"),用户需要重新按下actionButton()。如果此消息仅在自上次按下actionButton()后输入更改后呈现此消息,我会喜欢。

到目前为止,我已尝试在' eventReactive()'中使用全局变量。并尝试使用identical()但没有运气。

我的问题是:如果自上次按下按钮后任何输入发生变化,如何重新按下actionButton(),如何呈现有用的提醒?

这是一个带有许多输入的应用程序的最小示例,需要一些时间来输出

## app.R ##
library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    #arbritray inputs
    sliderInput("in1", label = "Input 1", value=1,min=0,max=5),
    sliderInput("in2", label = "Input 2", value=2,min=0,max=5),
    sliderInput("in3", label = "Input 3", value=3,min=0,max=5),
    actionButton("StartCalculation","Calculate")
  ),
  dashboardBody(
    textOutput("answer")
  )
)

server <- function(input, output) {

  out <- eventReactive(input$StartCalculation,{
        Sys.sleep(2) #simulate long computation
    input$in1+input$in2+input$in3
  })

  output$answer <- renderText({
    out()
  })
}

shinyApp(ui, server)

1 个答案:

答案 0 :(得分:2)

您可以在服务器内使用reactiveVal来保存“状态”(已更改或未更改)。只要按下按钮或输入改变,只需确保状态得到更新。

library(shiny)
library(shinydashboard)

ui <- fluidPage(
  inputPanel(
    #arbritray inputs
    sliderInput("in1", label = "Input 1", value=1,min=0,max=5),
    sliderInput("in2", label = "Input 2", value=2,min=0,max=5),
    sliderInput("in3", label = "Input 3", value=3,min=0,max=5),
    actionButton("StartCalculation","Calculate")
  )
  textOutput("answer"),
  textOutput("status")
)

server <- function(input, output) {
  status <- reactiveVal()

  out <- eventReactive(input$StartCalculation,{
    status("up to date")
    Sys.sleep(2) #simulate long computation
    input$in1+input$in2+input$in3
  })

  observeEvent({list(input$in1,input$in2,input$in3)},
               {status("Needs recalculation")})

  output$answer <- renderText({out()})

  output$status <- renderText({status()})
}

shinyApp(ui, server)