Как отключить кнопку действия на n секунд после обновления renderPlot - PullRequest
0 голосов
/ 14 апреля 2019

Я очень новичок в программировании на R / Shiny: я постараюсь сделать все возможное, чтобы точно сформулировать свой вопрос.

Приложение ниже представляет собой простое приложение на выбор между двумя альтернативами. В приложении опция A обновляется каждый раз, когда нажимается одна из кнопок действий, а опция B остается неизменной.

Я пытаюсь отключить обе кнопки действий после каждого обновления графика, чтобы «заставить» пользователя смотреть на две обновленные альтернативы как минимум на минимальное количество секунд (в приведенном ниже коде). 3).

Поскольку график обновляется каждый раз, когда один человек нажимает на кнопку действия, я попытался использовать Sys.sleep(3) между функциями отключения и включения (в пакетеinyjs) внутри observeEvent(input$action2_pe,...) и observeEvent(input$action1_pe,...), но это только делает недействительными обе кнопки, пока график все еще обновляется, поэтому в результате кнопки отключаются, а затем снова включаются только до обновления графика.

Другая эквивалентная попытка (код ниже) использовала Sys.sleep(3) между функциями отключения и включения внутри observe({output$plotA=renderPlot({...}) и observe({output$plotB=renderPlot({...}), но получен тот же результат, что и выше (т.е. она отключает и включает кнопку перед отображением обновленного графика). ).

Любая идея / предложение о том, как отключить, а затем снова включить кнопки только после обновления графика каждый раз?

Заранее благодарю за помощь!

library(shinyjs)
library(shiny)

ui <- fluidPage(id="main",title="Example disable-enable actionbutton after plotoutput update",

                shinyjs::useShinyjs(),
                  fluidRow(wellPanel(
                                splitLayout(cellWidths = c("50%", "50%"),
                                column(12,align="center",
                                plotOutput("plotA",width="100%"),
                                actionButton("buttonA", label = "Choice A")),
                                column(12,align="center",
                                plotOutput("plotB",width="100%"),
                                actionButton("buttonB", label = "Choice B")
                                                    )))))



server <- function(input, output, session) {

  rv=reactiveValues()
  range=10

######

  s_data=data.frame(X2=c(500,400,300,200,100), Y2=c(0,0,0,0,0))
  q=1
  m=dim(s_data)[1]
  s_data=s_data[sample(1:m,m),]

  rv$X2=s_data[q,"X2"]; 
  rv$Y2=s_data[q,"Y2"]; 

  observe({rv$pres=0.5*(rv$X2 + rv$Y2)})
  observe({rv$dmin=rv$Y2 ; rv$dmax=rv$X2}) 

  rv$q=1

####  

  fun=function(a1,b1,c1){

    totlength=100

    plot(NA,xlim=c(-10,totlength),ylim=c(0,10),
         axes=F,xlab="",ylab="")

    if (b1>a1){
    text(45,0,paste("Adopt", round(c1,digits=0), "cats" ,"in", 2 , "days"))
    }

    if (a1>b1){
    text(45,0,paste("Adopt", rv$X2, "cats" ,"in", 10 , "years"))
    }
  }

####

step_pe=reactive((rv$dmax-rv$dmin)<=range)

observe({output$plotA=renderPlot({
          par(fig = c(0,1,0,1))
          fun(1,2,rv$pres)

          shinyjs::disable("buttonA")
          shinyjs::disable("buttonB")
          Sys.sleep(3)
          shinyjs::enable("buttonA")
          shinyjs::enable("buttonB")

    })})


observe({output$plotB=renderPlot({
          par(fig = c(0,1,0,1))
          fun(2,1,rv$pres)

          shinyjs::disable("buttonA")
          shinyjs::disable("buttonB")
          Sys.sleep(3)
          shinyjs::enable("buttonA")
          shinyjs::enable("buttonB")

    })})



observeEvent(input$buttonA,{

      if(!step_pe()){
      rv$dmax=rv$pres
      temp1=round(0.5*(rv$dmin+rv$pres)/range)
      rv$pres=range*temp1

      }
    })

observeEvent(input$buttonB,{
    if (!step_pe()){
      rv$dmin=rv$pres
      temp1=round(0.5*(rv$dmax+rv$pres)/range)
      rv$pres=range*temp1

    }  
    })



}  


shinyApp(ui = ui, server = server)
...