【问题标题】:R shiny bi-directional reactive widgetsR闪亮的双向反应小部件
【发布时间】:2015-03-05 20:23:34
【问题描述】:

我正在努力弄清楚如何让 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)
    ))

  )
))

【问题讨论】:

    标签: r shiny


    【解决方案1】:

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

    【讨论】:

    • 这也可以作为任何两个小部件的模板,正如我所怀疑的,刚刚确认。
    • 如果你有 8 个输入并且你想更新 selectInput 而不让事情变得重复或循环,你会怎么做?
    【解决方案2】:

    如果您将每个输入滑块封闭在一个反应​​式观察下,您就可以实现您的目标。这不仅适用于两个输入,也适用于多个输入。让我通过一个例子来解释:

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

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 2018-07-25
      • 2018-02-08
      • 2019-02-15
      • 1970-01-01
      • 2022-08-09
      • 2021-08-07
      • 1970-01-01
      • 2021-09-29
      相关资源
      最近更新 更多