在计算之前需要按下按钮,并以Shiny绘制绘图

时间:2019-05-26 10:58:28

标签: r shiny shiny-reactivity

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

日期检查应以反应方式进行。但是,一角钱系列下降了,计算需要一些时间。因此,我希望仅通过按一下按钮即可完成操作。

我已经完成了大部分工作。但是,虽然我可以推迟计算的第一个实例,直到使用按下按钮为止

    "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)

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

1 个答案:

答案 0 :(得分:0)

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

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. 按钮将数据发送到reactValue:data-> react-> make plot-> display plot

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

但是您无需同时使用它。