使用观察事件并更新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)
答案 0 :(得分:0)
您的代码有几个问题:
Trace
varSelectInput
需要数据TracePlot
,所以请使用renderUI
observeEvent
内使用renderPlot
,因为它已经是反应性的。而是直接使用input$Unit
或基于input$Unit
更新数据,调用之前创建的反应变量。updateVarSelectInput
中使用无功值,则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)