我有一些代码正在尝试用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)
因此,这一直有效,直到第一次单击。我可以在有效日期和无效日期之间更改日期,并且在单击按钮之前不会绘制任何图表。然后,如果我移动到无效日期,则图表消失,这是正确的。但是,如果我返回有效日期,该图表将再次出现(如果我附上了实际的冗长代码,则会重新计算图表)。只是停止计算直到按下按钮的代码,这不仅是第一次,而且在以后的情况下,都将是很棒的。谢谢!
答案 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_title
和observeEvent
命令。但是将它们分开可以给我更大的灵活性。
在您的上下文中,我建议将数据准备和绘图生成分开以使用此方法。您可以在两个位置使用反应性值:
按钮将数据发送到reactValue:data-> react-> make plot-> display plot
按钮将图发送到reactValue:数据->绘制图->反应式->显示图
但是您无需同时使用它。