如何在选项卡中将两个uiOutput馈送到renderUI

时间:2019-11-05 23:38:11

标签: r shiny

当我使用uiOutput闪亮时尝试将renderUI馈入tabPanellibrary(shiny) ui <- fluidPage( tabsetPanel( tabPanel("Data", uiOutput("moreControls") ), tabPanel("Research", uiOutput("moreControls2") ) ), plotOutput("plot1") ) server <- function(input, output) { output$moreControls <- renderUI({ tagList( sliderInput("mean", "Mean", -10, 10, 1), textInput("label", "Label") ) }) output$moreControls2 <- renderUI({ tagList( sliderInput("sd", "SD", 1, 50, 10), textInput("label2", "Label2") ) }) output$plot1 <- renderPlot({ hist(rnorm(n = 100,input$mean, input$sd) , xlim = c(-100, 100) ) }) } shinyApp(ui, server) 时,在第一次运行中出现错误。切换选项卡后,该应用程序运行正常。

这是再现错误的最小示例

Vector2D

2 个答案:

答案 0 :(得分:1)

@Vivek的答案很好,但这是另一种方式:

server <- function(input, output) {
  output$moreControls <- renderUI({
    tagList(
      sliderInput("mean", "Mean", -10, 10, 1),
      textInput("label", "Label")
    )
  })

  output$moreControls2 <- renderUI({
    tagList(
      sliderInput("sd", "SD", 1, 50, 10),
      textInput("label2", "Label2")
    )
  })
  outputOptions(output, "moreControls2", suspendWhenHidden = FALSE)

  output$plot1 <- renderPlot({ 
    req(input$mean, input$sd)
    hist(rnorm(n = 100, input$mean, input$sd) , xlim = c(-100, 100) )
  })

}
shinyApp(ui, server)

input$meanuiOutput渲染之前不可用,input$sd也不可用,但是另外input$sd在切换到第二个选项卡之前不可用,因为liderInput隐藏。

答案 1 :(得分:0)

之所以不起作用,是因为Shiny尚未在您的应用运行时评估这些值。因此,renderPlot()

实际上不可用输入值

传递图形值的一种好方法是使用反应表达式。在下面的代码中,我使用了plot_params(),在反应式代码中,我创建了一个列表,其中存储了生成图的参数。

我还建议您使用shiny::validate()来确保输入值在渲染输出之前是有效的。 (请参见下面的用法)

library(shiny)

ui <- fluidPage(
  tabsetPanel(
    tabPanel("Data", 
             uiOutput("moreControls") 
    ),
    tabPanel("Research",
             uiOutput("moreControls2") 
    )
  ),
  plotOutput("plot1")
)

server <- function(input, output) {
  output$moreControls <- renderUI({
    tagList(
      sliderInput("mean", "Mean", -10, 10, 1),
      textInput("label", "Label")
    )
  })

  output$moreControls2 <- renderUI({
    tagList(
      sliderInput("sd", "SD", 1, 50, 10),
      textInput("label2", "Label2")
    )
  })

  # Reactive expression for plot parameters.
  plot_params <- reactive({
    list(
      mean = input$mean,
      sd = input$sd
    )
  })

  output$plot1 <- renderPlot({
    validate(
      need(input$mean, 'Please check that mean is set!'),
      need(input$sd, 'Please check that sd is set.')
    )
    hist(rnorm(n = 100, plot_params()$mean, plot_params()$sd) , xlim = c(-100, 100) )
  })

}
shinyApp(ui, server)