如何在renderPlot更新后的n秒钟内禁用操作按钮

时间:2019-04-14 15:18:23

标签: shiny shinyjs

我对使用R / Shiny编程非常陌生:我会尽力准确地陈述我的问题。

以下应用是在两个替代方案之间选择的简单应用。在应用程序中,选项A每次单击其中一个操作按钮时都会更新,而选项B保持固定。

我想做的是每次更新绘图后都禁用两个操作按钮,以“强制”用户凝视两个更新的替代方法至少最少几秒钟(在下面的代码中) ,3)。

由于每次单击一个动作按钮时该图都会更新,因此我尝试在Sys.sleep(3)observeEvent(input$action2_pe,...)内的禁用和启用功能(在Shinyjs包中)之间使用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)

0 个答案:

没有答案