在进行计算并在 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_title
和 observeEvent
命令。但是将它们分开给了我更多的灵活性。
在您的上下文中,我建议将数据准备和绘图生成分开,以便使用此方法。您可以在任一位置使用反应值:
Button发送数据到reactiveValue:data --> reactive --> make plot --> display plot
按钮将绘图发送到 reactiveValue:数据 --> 制作绘图 --> 反应 --> 显示绘图
但你不需要同时使用它。
我想用 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_title
和 observeEvent
命令。但是将它们分开给了我更多的灵活性。
在您的上下文中,我建议将数据准备和绘图生成分开,以便使用此方法。您可以在任一位置使用反应值:
Button发送数据到reactiveValue:data --> reactive --> make plot --> display plot
按钮将绘图发送到 reactiveValue:数据 --> 制作绘图 --> 反应 --> 显示绘图
但你不需要同时使用它。