当 Shiny 繁忙时禁用元素

Disable elements when Shiny is busy

我正在使用来自这个问题的 javascript 的一部分:

它适用于按钮,但我也想禁用 sliderInputselectInputtextInput 等功能。

我尝试将 'button' 替换为 'input',这会禁用 textinput 字段。我想知道是否有一种方法可以一次性禁用所有元素。

更大的问题如下: 当您打开 dropdownbutton 时,关闭按钮通常应该删除 modal dialog 以防 javascript 标签从下面的演示应用程序中删除。但是,当脚本在应用程序中时,关闭按钮由于某种原因不再起作用。它仍然打印文本命令,这意味着它被观察到,但模式不会关闭。对话框中的另一个按钮仍然正常工作。

应用:

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  h3('Disable buttons while running'),
  actionButton('btn_run','Run long process'),
  hr(),
  h3('Inputs'),
  actionButton('btn1','Button 1'),
  hr(),
  textInput('text1', 'Text1',"my text:"),
  hr(),
  selectInput('select1', 'Selectinput', choices = c('A', 'B', 'C'), selected = 'A'),
  hr(),
  h5('Dropdown'),
  dropdownButton(inputId = "MyDropDown",
                 h3("This is a dropdown"),
                 actionButton('btn_run2','Run other long process'),
                 fluidRow(actionButton( "CloseDropDown", "Close"), style = "float: right; margin-right:10px"),
                 icon = icon("tasks"),
                 tooltip = tooltipOptions(title = "Click to open"), width = "500px"),
  hr(),
  sliderInput('slid3','Slider 1',min=0,max=1,value=0.5),


tags$script(HTML("$(document).on('shiny:busy', function() {
  var inputs = document.getElementsByTagName('button');
console.log(inputs);
for (var i = 0; i < inputs.length; i++) {
inputs[i].disabled = true;
}
});

$(document).on('shiny:idle', function() {
var inputs = document.getElementsByTagName('button');
console.log(inputs);
for (var i = 0; i < inputs.length; i++) {
inputs[i].disabled = false;
}
})" ))
)

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

  observeEvent(input$btn_run,{
    Sys.sleep(5)
  })


  observeEvent(input$btn_run2,{
    Sys.sleep(5)
  })

  observeEvent(input$CloseDropDown, {print('closing?')
    toggleDropdownButton(inputId = 'MyDropDown') })

}

shinyApp(ui = ui, server = server)

我无法帮助您关闭按钮,但我发现一旦您设置了 shiny:idle 句柄,对 JavaScript 的任何调用都会触发 shiny:idle 并因此运行处理程序而不是 toggleDropdownButton.

后面的 JavaScript 代码

但是,如何 select 中的多个元素 JavaScript 的第一个问题可以通过一些 jQuery 来解决。将您的代码更改为

$(document).on('shiny:busy', function() {
  var $inputs = $('button,input');
console.log($inputs);
$inputs.prop('disabled', true);
});

$(document).on('shiny:idle', function() {
var $inputs = $('button,input');
console.log($inputs);
$inputs.prop('disabled', false);
})

有了它,您可以 select 按钮和文本输入。现在您可以自己找出要使用哪些代码来禁用下拉菜单。

顺便说一句:也许你想看看 shinyjs::disable。使用此功能,您可以从 R 端禁用您的控件。您可以将其放在长计算的开头,并在末尾使用 shinyjs::enable