当 Shiny 繁忙时禁用元素
Disable elements when Shiny is busy
我正在使用来自这个问题的 javascript
的一部分:
它适用于按钮,但我也想禁用 sliderInput
、selectInput
和 textInput
等功能。
我尝试将 '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
。
我正在使用来自这个问题的 javascript
的一部分:
它适用于按钮,但我也想禁用 sliderInput
、selectInput
和 textInput
等功能。
我尝试将 '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
.
但是,如何 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
。