代码之家  ›  专栏  ›  技术社区  ›  Ali Hadjihoseini

在其他函数中从输入面板调用选项?

  •  1
  • Ali Hadjihoseini  · 技术社区  · 9 年前

    我有一个简单闪亮的应用程序:

    ui <- fluidPage(
      fileInput("File", "Input checkbox"),
      selectInput("inSelect", "Select input",c())
      leafletOutput("mymap")
    )
    
    server <- function(input, output, session) {
      cor<- reactive({
        x=input$File
    
        if (is.null(x))
          return(NULL)
    
        report_list <- c("Park result.txt",
                         "Park result minus",
                         "Park result plus")
        temp_files <- unzip(x$datapath)
        temp_files <- temp_files[grepl(paste(report_list, collapse = "|"), temp_files)]
    
        T=length(temp_files)
    
        A_new=c();for(i in 1:(T/3)){A_new[[i]]=c()}
        for(i in 1:(T/3)){A_new[[i]]=....}
    
        result <- list(T=T,A_new=A_new);
        return(result);
      })
    
    observeEvent(cor(),{
    updateSelectInput(session, "Select1",
                      label = paste(((cor()$T)/3),"different layout"),
                      choices = paste0("Layout",c(1:((cor()$T)/3))))
    })
    
    output$mymap <- renderLeaflet({
        infile=input$File
        if (is.null(infile))
          return(NULL)
        a2=cor()
        leaflet() %>%
          addProviderTiles("OpenTopoMap", group = "MapQuestOpen.Aerial") %>%
          addMarkers(data =a2$A_new[[1]],~long, ~lat, popup = ~as.character(mag), label = ~as.character(Name))%>% 
    
          addMeasure()
      })
    }
    
    shinyApp(ui, server)
    

    最后,在我的 output$mymap A_new ,如果用户选择 layout1 A_new[[1]] 如果 layout2 那么地图应该是 A_new[[2]] 显示?!

    2 回复  |  直到 9 年前
        1
  •  2
  •   Pork Chop    9 年前

    您也可以使用 observeEvent 代码要少得多

     observeEvent(cor(),{
        updateSelectInput(session, "inSelect",label = paste(cor()$t1,"different layout"),choices = paste0("Layout",c(1:cor()$t1)))
      })
    
        2
  •  1
  •   Florian    9 年前

    在反应式中定义的任何内容都无法从反应式外部访问。所以在反应中,你做到了

    x=input$File
    

    所以x是在你的反应中定义的,而不是在你的反应之外!因此,在您的观察者中:

    observe({ 
    if (is.null(x))
      return(NULL)
    ...
    

    observe({ 
    if (is.null(cor()))
      return(NULL)
    ...
    

    它会检查反应式是否为空。希望这有帮助!