我正在尝试禁用 a Shiny-input
,其值以另一个为条件Shiny-input
。之前我查看了disable()
来自 的函数shinyjs
,但就我而言,它似乎无法禁用此类闪亮输入。下面是我的例子:
library(shiny)
library(shinyjs)
runApp(shinyApp(
ui = fluidPage(
useShinyjs(),
sliderInput(inputId = "First", label = "First",
min = 10, max = 100, value = 40, step = 1),
uiOutput("Second_UI")
),
server = function(input, output, session) {
output$Second_UI = renderUI({
sliderInput(inputId = "Second", label = "Second",
min = 0, max = input$First, value = 5)
})
disable("Second_UI")
}
))
Run Code Online (Sandbox Code Playgroud)
我基本上想要的是 - 我的第二个sliderInput
ieSecond
仍然会从First
响应中获取价值,但是用户不应该能够控制它。
任何指针都将受到高度赞赏。
谢谢,
这不起作用的原因是您多次渲染该元素,但在脚本中仅禁用它一次 - 在元素实际渲染之前。
然而,实际上我们可以很简单地解决这个问题;Shinyjs
提供了一个disabled
函数,允许您将输入初始化为禁用。下面给出了一个工作示例。
希望这可以帮助!
library(shiny)
library(shinyjs)
runApp(shinyApp(
ui = fluidPage(
useShinyjs(),
sliderInput(inputId = "First", label = "First",
min = 10, max = 100, value = 40, step = 1),
uiOutput("Second_UI")
),
server = function(input, output, session) {
output$Second_UI = renderUI({
shinyjs::disabled(sliderInput(inputId = "Second", label = "Second",
min = 0, max = input$First, value = 5))
})
}
))
Run Code Online (Sandbox Code Playgroud)
@Florian 的答案是正确的(感谢您使用我的闪亮js 包!)。
但是,我想为您的原始代码提供一种替代实现,该实现可能更干净、更简单。
由于唯一改变的是最大值,因此您可以使用该updateSliderInput()
函数每次只更改最大值,而不是将滑块创建为 renderUI。这样,元素本身只创建一次,速度更快,使用起来更容易。
library(shiny)
library(shinyjs)
runApp(shinyApp(
ui = fluidPage(
useShinyjs(),
sliderInput(inputId = "First", label = "First",
min = 10, max = 100, value = 40, step = 1),
sliderInput(inputId = "Second", label = "Second",
min = 0, max = 40, value = 5)
),
server = function(input, output, session) {
observe({
updateSliderInput(session, "Second", max = input$First)
})
disable("Second")
}
))
Run Code Online (Sandbox Code Playgroud)