我正在尝试停用Shiny-input
,其值取决于另一个Shiny-input
。之前我查看了disable()
中的shinyjs
函数,但在我的情况下,似乎无法禁用此类Shiny-input。以下是我的例子:
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")
}
))
我基本上想要的是 - 我的第二个sliderInput
,Second
仍然会相应地从First
获取价值,但是用户不应该控制它。
任何指针都将受到高度赞赏。
谢谢,
答案 0 :(得分:1)
这不起作用的原因是你多次渲染元素,但在脚本中只禁用它一次 - 在元素实际渲染之前。
然而,我们可以很简单地解决这个问题; 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))
})
}
))
答案 1 :(得分:1)
@Florian的答案是正确的(感谢您使用我的shinyjs包!)。
但是,我想为您的原始代码提供一种可能更简洁,更容易的替代实现。
不是将滑块创建为renderUI,因为唯一更改的是最大值,您可以使用updateSliderInput()
函数每次只更改最大值。这样,元素本身只创建一次,它更快,更容易使用。
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")
}
))