禁用以另一个闪亮输入为条件的闪亮输入
Posted
技术标签:
【中文标题】禁用以另一个闪亮输入为条件的闪亮输入【英文标题】:Disable a Shiny-input which is conditional on another Shiny-input 【发布时间】:2018-07-21 10:19:55 【问题描述】:我正在尝试禁用Shiny-input
,其值取决于另一个Shiny-input
。以前我从shinyjs
中查看了disable()
函数,但是在我的情况下,它似乎无法禁用这种闪亮的输入。下面是我的例子:
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
中获取价值,但是用户不应该能够控制它。
任何指针都将受到高度赞赏。
谢谢,
【问题讨论】:
【参考方案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")
))
【讨论】:
【参考方案2】:这不起作用的原因是您多次渲染元素,但在脚本中只禁用一次 - 在元素实际渲染之前。
然而,我们实际上可以很简单地解决这个问题; 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))
)
))
【讨论】:
以上是关于禁用以另一个闪亮输入为条件的闪亮输入的主要内容,如果未能解决你的问题,请参考以下文章
在 flexdashboard 闪亮小部件中创建一个依赖于另一个输入变量的输入变量