Требование нажатия кнопки перед выполнением расчетов и построением графика в Shiny - PullRequest
0 голосов
/ 26 мая 2019

У меня есть код, который я пытаюсь написать в 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 голосов
/ 27 мая 2019

Я решил эту проблему в предыдущем приложении с помощью реактивных значений. Рассмотрим следующий пример:

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. Но раздельное их дает мне больше гибкости.

В вашем контексте, я бы порекомендовал разделить подготовку данных и генерацию графика, чтобы использовать этот метод. Вы можете использовать реактивные значения в любом месте:

  1. Кнопка отправляет данные в реактивное значение: данные -> реактивное -> создание графика -> отображение графика

  2. Кнопка отправляет график в реактивное значение: данные -> создать график -> реактивный -> показать график

Но вам не нужно использовать его одновременно.

...