R shiny bi-directional 响应式小部件
R shiny bi-directional reactive widgets
我正在努力弄清楚如何让 2 个 R Shiny 小部件相互更新。例如,可以更新文本框小部件的滑块小部件,反之亦然,最终用户可以选择使用任一小部件。
这个问题很相似,但没有答案,所以我给出了一个(希望)更简单的例子。
Retrieving reactive dependencies as inferred by shiny::reactive()。如果这个问题在别处有答案,我一直找不到这样的答案。
我想知道是否可以移动 slider1 来移动 slider2 和 slider2 来移动 slider1。现在我只能做第一部分(我可以移动 slider1 来移动 slider2)。如果我能做到这一点,我想我可以使小部件 1 成为滑块,而小部件 2 成为数字输入,代码几乎相同。
下面的例子是从 http://shiny.rstudio.com/gallery/update-input-demo.html 修改而来的,它是我能做的最简单的例子。它也是我能找到的唯一一款接近我所寻找的应用程序,尽管我意识到可能需要一种非常不同的方法...
Server.R代码
shinyServer(
function(input, output, clientData, session) {
#### one way interaction between slider 1 and 2 ####
observe({![enter image description here][1]
c_label <- input$control_label
c_num <- input$control_num # <- input$inSlider
# Slider input =============================================
updateSliderInput(session, "inSlider",
label = paste("Slider2", c_label),
value = c_num)
updateSliderInput(session, "control_num",
label = paste("Slider1", c_label),
value = c_num)
})
})
Ui.r代码
shinyUI(fluidPage(
titlePanel("One Way Reactive Slider"),
fluidRow(
column(3,
wellPanel(
h4("Slider Inputs"),
sliderInput("control_num",
"This controls values:",
min = 1, max = 20, value = 15),
sliderInput("inSlider", "Slider input:",
min = 1, max = 20, value = 15)
))
)
))
诀窍是创建动态 UI。通过这种方式,您可以根据其他 UI 元素的变化更新滑块绘图表达式,并使用不同的默认值重建滑块小部件:
server.R
shinyServer(
function(input, output, clientData, session) {
output$slider1 <- renderUI({
slider2.value <- input$inSlider
default.slider1 <- if (is.null(slider2.value)) 15 else slider2.value
sliderInput("control_num",
"This controls values:",
min = 1, max = 20, value = default.slider1)
})
output$slider2 <- renderUI({
slider1.value <- input$control_num
default.slider2 <- if (is.null(slider1.value)) 15 else slider1.value
sliderInput("inSlider", "Slider input:",
min = 1, max = 20, value = default.slider2)
})
})
ui.R
shinyUI(fluidPage(
titlePanel("One Way Reactive Slider"),
fluidRow(
column(3,
wellPanel(
h4("Slider Inputs"),
uiOutput('slider1'),
uiOutput('slider2')
))
)
))
如果将每个输入滑块都置于响应式观察之下,就可以实现您的目标。这不仅适用于两个输入,也适用于多个输入。让我举例说明:
observe({
# Create a reactive relationship with slider1
input$slider1
# Update the second slider - slider2
updateTextInput(session, "slider2", NULL, input$slider1)
)}
与第二个输入类似,您必须通过以下方式重复代码:
observe({
# Create a reactive relationship with slider2
input$slider2
# Update the second slider - slider1
updateTextInput(session, "slider1", NULL, input$slider2)
)}
我正在努力弄清楚如何让 2 个 R Shiny 小部件相互更新。例如,可以更新文本框小部件的滑块小部件,反之亦然,最终用户可以选择使用任一小部件。
这个问题很相似,但没有答案,所以我给出了一个(希望)更简单的例子。 Retrieving reactive dependencies as inferred by shiny::reactive()。如果这个问题在别处有答案,我一直找不到这样的答案。
我想知道是否可以移动 slider1 来移动 slider2 和 slider2 来移动 slider1。现在我只能做第一部分(我可以移动 slider1 来移动 slider2)。如果我能做到这一点,我想我可以使小部件 1 成为滑块,而小部件 2 成为数字输入,代码几乎相同。
下面的例子是从 http://shiny.rstudio.com/gallery/update-input-demo.html 修改而来的,它是我能做的最简单的例子。它也是我能找到的唯一一款接近我所寻找的应用程序,尽管我意识到可能需要一种非常不同的方法...
Server.R代码
shinyServer(
function(input, output, clientData, session) {
#### one way interaction between slider 1 and 2 ####
observe({![enter image description here][1]
c_label <- input$control_label
c_num <- input$control_num # <- input$inSlider
# Slider input =============================================
updateSliderInput(session, "inSlider",
label = paste("Slider2", c_label),
value = c_num)
updateSliderInput(session, "control_num",
label = paste("Slider1", c_label),
value = c_num)
})
})
Ui.r代码
shinyUI(fluidPage(
titlePanel("One Way Reactive Slider"),
fluidRow(
column(3,
wellPanel(
h4("Slider Inputs"),
sliderInput("control_num",
"This controls values:",
min = 1, max = 20, value = 15),
sliderInput("inSlider", "Slider input:",
min = 1, max = 20, value = 15)
))
)
))
诀窍是创建动态 UI。通过这种方式,您可以根据其他 UI 元素的变化更新滑块绘图表达式,并使用不同的默认值重建滑块小部件:
server.R
shinyServer(
function(input, output, clientData, session) {
output$slider1 <- renderUI({
slider2.value <- input$inSlider
default.slider1 <- if (is.null(slider2.value)) 15 else slider2.value
sliderInput("control_num",
"This controls values:",
min = 1, max = 20, value = default.slider1)
})
output$slider2 <- renderUI({
slider1.value <- input$control_num
default.slider2 <- if (is.null(slider1.value)) 15 else slider1.value
sliderInput("inSlider", "Slider input:",
min = 1, max = 20, value = default.slider2)
})
})
ui.R
shinyUI(fluidPage(
titlePanel("One Way Reactive Slider"),
fluidRow(
column(3,
wellPanel(
h4("Slider Inputs"),
uiOutput('slider1'),
uiOutput('slider2')
))
)
))
如果将每个输入滑块都置于响应式观察之下,就可以实现您的目标。这不仅适用于两个输入,也适用于多个输入。让我举例说明:
observe({
# Create a reactive relationship with slider1
input$slider1
# Update the second slider - slider2
updateTextInput(session, "slider2", NULL, input$slider1)
)}
与第二个输入类似,您必须通过以下方式重复代码:
observe({
# Create a reactive relationship with slider2
input$slider2
# Update the second slider - slider1
updateTextInput(session, "slider1", NULL, input$slider2)
)}