我对使用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)