一个反应函数以交互方式显示在两个不同的页面上

时间:2018-06-14 07:51:56

标签: r shiny render uioutput

我有一个有3个tabItem的应用程序。我想在第二页上使用滑块以交互方式在第三页上显示相同的结果,即如果第二页滑块发生变化,那么第三页滑块也应分别改变。

我在服务器端有一个反应功能

choose_segment <-  reactive({

  Multiple conditions for dropdown{Due to security cant share the exact code.}

  })

并且这个choose_segment在UI中被引用一次,现在我也想在第三页上使用它,但是当我在第三页上调用该函数时,它不会在ui上显示任何内容而且也不会给出任何错误。 在UI中,它在UIoutput内部调用。

uiOutput(choose_segment())

我的观察:我认为根据我的研究,我们不能直接调用一个函数两次,所以我所做的是我已经创建了两个不同的函数并从它们调用相同的函数,即

output$chooseSegment1 <- renderUI({
  choose_segment()
  })
  output$chooseSegment2 <- renderUI({
    choose_segment()
  })

问题:它给了我输出,但它们都不是交互式的:(

请提供解决方案,以便我可以使两个滑块以交互方式工作。

1 个答案:

答案 0 :(得分:1)

我曾经遇到过相同的情况,因为我想更改代码结构。 我将动态输出uiOutput设置为下拉菜单ob ui,然后在服务器中使用与Input $ xyz相同的服务器上的watch,它对我有用。 代码:

UI : column(3, selectInput(inputId="ABC",label= "Choose ABC"))
 column(3, selectInput(inputId="ABC1",label= "Choose ABC"))
Server : observe({

    if(is.null(tab2_summary())) return(NULL)
    updateSelectInput(session, "ABC", value = input$ABC)

  })
observe({
  updateSelectInput(session, "ABC1", value = input$ABC)

})
observe({

  updateSelectInput(session, "ABC", value = input$ABC1)

})

这就是我能够在两个不同页面上使selectInput交互的方式。 供您参考,其中有一个完整的可复制代码。 请参考

library(shiny)
# UI ----------------------------------------------------------
ui <- navbarPage("Navbar!",
                 tabPanel("Plot", sidebarLayout(sidebarPanel(
                   radioButtons("yaxis1", "y-axis", c("speed"="speed", "dist"="dist"),
                                selected = "speed"
                   )),
                   mainPanel( plotOutput("plot"),
                              textOutput("test2")))),  # for input checking

                 tabPanel("Summary", sidebarLayout(sidebarPanel(
                   radioButtons("yaxis2", "grouping-var", c("speed"="speed", "dist"="dist")
                   )),
                   mainPanel(
                     verbatimTextOutput("summary"),
                     textOutput("test1")
                   )))
)
# Server ------------------------------------------
server <- function(input, output, session) {

  observe({
    x <- input$yaxis1
    updateRadioButtons(session, "yaxis2", selected = x)
  })

  observe({
    y <- input$yaxis2
    updateRadioButtons(session, "yaxis1", selected = y)
  })

  # output$test1 <- renderPrint({cat("yaxis1", input$yaxis1)})
  # output$test2 <- renderPrint({cat("yaxis2", input$yaxis2)})
  # output$plot <- renderPlot({ plot(cars[['speed']], cars[[input$yaxis1]]) })
  # output$summary <- renderPrint({ summary(cars[[input$yaxis2]]) })
}
shinyApp(ui, server)

希望您能帮上忙。