在进行计算并在 Shiny 中绘制绘图之前需要按下按钮

Requiring button press before calculations carried out and plot drawn in Shiny

我想用 Shiny 编写一些代码。这涉及以下步骤: - 选择日期 - 检查日期是否存在有效的输入文件 - 如果存在有效的输入文件,则下拉在该日期结束的远程时间序列 - 进行计算 - 绘制计算结果

日期检查应该是被动完成的。但是,dime 系列下拉和计算需要一些时间。因此,我希望只需按下按钮即可完成此操作。

我完成了大部分工作。但是,虽然我可以将计算的第一个实例关闭,直到使用

按下按钮
    "if(input$run_shiny_risk==0){
    } else {
    #some code
    }

我无法阻止它在后续实例上自动计算。换句话说,一旦选择了有效日期,计算就会自动开始。我试图隔离计算但没有成功。我还尝试隔离一个由按钮值驱动的虚拟变量,但还是没有成功。这是我在代码方面的内容:

library(shiny)

ui <- fluidPage(

titlePanel("Risk Dashboard"),
sidebarLayout(

sidebarPanel(

  helpText("Effective date"),

  dateInput("shiny_end_date",
            label = "Date (yyyy-mm-dd):",
            value = "2018-12-31"),

  actionButton("run_shiny_risk",
               label = "Run risk report:"),

  textOutput("selected_var")

),

mainPanel(

  plotOutput("selected_var1")

)
)
)

server <- function(input, output) {

shiny_risk_test <- 0

output$selected_var <- renderText({

holdings_data_file <-paste(substr(input$shiny_end_date,3,4),substr(input$shiny_end_date,6,7),substr(input$shiny_end_date,9,10),"_Data.csv",sep="")
if(file.exists(holdings_data_file)){

  end_date <- input$shiny_end_date

  paste("You have selected", end_date)

} else {
  "No such file"
}
})

output$selected_var1 <- renderPlot({

holdings_data_file <-paste(substr(input$shiny_end_date,3,4),substr(input$shiny_end_date,6,7),substr(input$shiny_end_date,9,10),"_Data.csv",sep="")

if(file.exists(holdings_data_file)){

 if(input$run_shiny_risk==0){

   #this stops the chart from being drawn initially...

    } else {


    plot_data <- cbind(c(1,2,3,4),c(1,2,3,4))        
    p<-plot(plot_data)

    p
    }

} else {       

} 
})
}

shinyApp(ui = ui, server = server)

因此,在第一次点击之前一直有效。我可以在有效日期和无效日期之间更改日期,并且在我按下按钮之前不会绘制图表。然后,如果我移动到无效日期,图表就会消失,这是正确的。但是如果我回到一个有效的日期,图表会再次出现(如果我有实际的、冗长的代码会被重新计算)。在按下按钮之前停止计算的代码,不仅是第一次,而且在随后的情况下,会很棒。谢谢!

我在之前的应用程序中通过使用反应值解决了这个问题。考虑以下示例:

server <- function(input, output, session) {

  output_staging <- reactiveValues()
  output_staging$title <- NA

  observeEvent(input$updateButton,{  update_title()  })

  update_title <- function(){
    output_staging$title <- paste0("random number ",runif(1))
  }

  output$title <- renderText(output_staging$title)

}

renderText 输出查看存储在 output_staging$title 中的无功值。每次单击按钮时,都会调用一个更新函数来替换反应值。

请注意,我可以合并函数 update_titleobserveEvent 命令。但是将它们分开给了我更多的灵活性。

在您的上下文中,我建议将数据准备和绘图生成分开,以便使用此方法。您可以在任一位置使用反应值:

  1. Button发送数据到reactiveValue:data --> reactive --> make plot --> display plot

  2. 按钮将绘图发送到 reactiveValue:数据 --> 制作绘图 --> 反应 --> 显示绘图

但你不需要同时使用它。