R闪亮的双向反应小部件

时间:2015-01-07 20:20:52

标签: r shiny

我正在努力弄清楚如何让2个R Shiny小部件相互更新。例如,一个可以更新文本框小部件的滑块小部件,反之亦然,最终用户可以选择使用其中一个小部件。

这个问题很相似,但没有答案,所以我给的是(希望)一个更简单的例子。 Retrieving reactive dependencies as inferred by shiny::reactive()。如果在其他地方回答这个问题,我一直无法找到这样的答案。

我想知道我是否可以移动slider1来移动slider2和slider2来移动slider1。现在我只能做第一部分(我可以移动slider1来移动slider2)。如果我能做到这一点,我想我可以使widget 1成为一个滑块,widget 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 Code

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)
    ))

  )
))

Below is a picture of the app while running. Moving slider 1 moves slider 2, but the opposite is not true (which is what I would like to do).

2 个答案:

答案 0 :(得分:5)

诀窍是创建动态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')
        ))

      )
    ))

答案 1 :(得分:0)

如果将每个输入滑块包含在反应式观察中,则可以实现目标。这不仅适用于两个输入,也适用于多个输入。让我通过一个例子来解释:

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)
)}