我有一些代码,我试图用闪亮写。这涉及以下步骤: - 选择日期 - 检查日期是否存在有效的输入文件 - 如果存在有效的输入文件,请拉下该日期结束的远程时间序列 - 进行计算 - 绘制计算的结果
应反应地进行日期检查。但是,一角钱系列下拉和计算需要一些时间。因此,我希望只按按钮按下。
我大部分工作。但是,虽然我可以将计算的第一个实例关闭,直到按下按钮使用
"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)
因此,这可以正常单击。我可以在有效和无效的日期之间更改日期,直到点击按钮,才能绘制图表。然后,如果我转到无效的日期,则图表消失了,这是正确的。但是,如果我返回有效的日期,则图表再次出现(如果我拥有实际的,冗长的代码,则将重新计算(。并且只停止计算的代码,直到按下按钮,不仅是第一次,而且在后续情况下按下按钮都很棒。谢谢!
i通过使用反应值在先前的应用中解决了此问题。考虑以下示例:
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_title
和observeEvent
命令。但是将它们分开可以使我更加灵活。
在您的上下文中,我建议将数据准备和绘图生成分开,以便使用此方法。您可以在任一个位置使用反应性值:
按钮将数据发送到reactiveValue:data->反应性 -> make plot->显示图
在
,但您不需要两者都使用它。