闪亮的R-下拉列表在使用observeEvent和updateVarSelection

时间:2019-08-18 01:21:33

标签: r shiny

使用观察事件并更新var选择时,它每次都会重置为下拉列表的顶部

我有一个非常大的数据集,当选择一个单位时,它将过滤数据集,因此下一个下拉列表仅包含与要绘制的该单位有关的参数。 除了下拉列表不仅在单位更改上刷新所有输入之外,它还可以工作,我希望它仅在单位更改时刷新。 即,当选择单位a时,下拉列表将变为单位温度,单位压力,单位水平等。单位b温度,单位b压力等。

但是,如果我选择单位b,则下拉列表将变为单位b温度,单位b温度等,其中温度为列表中的第一位,并自动在图表上显示,如果我单击下拉列表并选择压力,图表将简要显示压力,但显然触发了观察事件,列表会重置自身并默认返回到温度

为了清楚起见,对代码的某些部分进行了总结,而不是逐字逐句

# Define UI for application that plots User Input and filtered data 
 ui <-   navbarPage( "Viewer",
    tabPanel("Chart" , plotOutput(outputId = "newPlot"), 

    box(selectInput("Unit", "Chose Unit",c(a,b,c),selected = NULL)),
                    box(varSelectInput("Parameter", "Select the Parameter 
    to Plot:",TracePlot, selected = NULL )),

   ))




  # Define server logic 
  server <- function(input, output,session) { output$newPlot <- 
   renderPlot({


TracePlot<-filters on unit selected (input$Unit) 

observeEvent(input$Unit, updateVarSelectInput(session,"Parameter", 
"Select the Parameter to Plot:", TracePlot,selected = NULL) )




  ggplot(Trace, aes_string(y=input$Parameter, x=input$Batch_Or_Step)) + 
  geom_point() 
 })

 }


# Run the application 
shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:0)

您的代码有几个问题:

  1. 可重复性:尝试在发布前在刷新的R会话中运行代码段
    • 您在单位选择器中缺少的选择
    • 您在用户界面的末尾使用了逗号
    • 您没有定义变量Trace
    • 缺少任何示例数据来直接帮助您编写代码。这是必要的,因为varSelectInput需要数据
  2. 您不能在ui中使用TracePlot,所以请使用renderUI
  3. 反应性:您无需在observeEvent内使用renderPlot,因为它已经是反应性的。而是直接使用input$Unit或基于input$Unit更新数据,调用之前创建的反应变量。
  4. 如果您已经在updateVarSelectInput中使用无功值,则
  5. varSelectInput("Parameter", ...)是多余的。如果您想更新selected,最好在observe()之外使用renderPlot

首先尝试一下,我解释了我所做的更改

library(shiny)
library(ggplot2)
# Define UI for application that plots User Input and filtered data 
ui <-   navbarPage(
  "Viewer",
  tabPanel(
    "Chart" , 
    plotOutput(outputId = "newPlot"), 
    box(selectInput("Unit", "Chose Unit", c("a","b","c"), selected = NULL)),
    # uiOutput to render selectInput/varSelectInput in server session using
    # reactive Values
    box(uiOutput("selectParameter"))
  )
)




# Define server logic 
server <- function(input, output,session) { 
  # create reactive
  TracePlot <- reactiveValues()
  # update reactive with your filter
  observe({
    # Do your filtering here and save to TracePlot$filter 
    TracePlot$filter <- input$Unit
  })

  # From ui to server with renderUI - change to varSelectInput again if data 
  # provided
  output$selectParameter <- renderUI({
    req(TracePlot$filter)
    selectInput(
      "Parameter", 
      "Select the Parameter to Plot:",
      input$Unit, 
      selected = NULL 
    )
  })

  # cannot plot without data and Trace
  output$newPlot <- renderPlot({
    req(TracePlot$filter)

    #ggplot(Trace, aes_string(y=input$Parameter, x=input$Batch_Or_Step)) + 
      #geom_point() 
  })

}


# Run the application 
shinyApp(ui = ui, server = server)