我有一个应用程序,它有很多输入,并使用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)
答案 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)