2014-04-03 7 views
14

Si è verificato un problema perché è in corso l'operazione di osservazione prima che i carichi dell'interfaccia utente vengano caricati.R lucido Osservare in esecuzione Prima del caricamento dell'interfaccia utente e ciò causa i parametri Null

Ecco il mio ui.R

sidebarPanel(
    selectInput("Desk", "Desk:" , as.matrix(getDesksUI())), 
    uiOutput("choose_Product"), #this is dynamically created UI 
    uiOutput("choose_File1"), #this is dynamically created UI 
    uiOutput("choose_Term1"), #this is dynamically created UI .... 

Ecco il mio Server.R

shinyServer(function(input, output,session) { 

    #this is dynamic UI 
    output$choose_Product <- renderUI({ 
    selectInput("Product", "Product:", as.list(getProductUI(input$Desk))) 
    }) 

    #this is dynamic UI 
    output$choose_File1 <- renderUI({ 
    selectInput("File1", "File 1:", as.list(getFileUI(input$Desk, input$Product))) 
    }) 

    #this is dynamic UI and I want it to run before the Observe function so the call 
    # to getTerm1UI(input$Desk, input$Product, input$File1) has non-null parameters 
    output$choose_Term1 <- renderUI({ 
    print("Rendering UI for TERM") 
    print(paste(input$Desk," ", input$Product, " ", input$File1,sep="")) 
    selectInput("Term1", "Term:", getTerm1UI(input$Desk, input$Product, input$File1)) 
    }) 

Questo è il mio osservare funzione e viene eseguito prima dell'ingresso $ prodotto e l'ingresso $ File1 sono popolate in modo Ottengo un errore perché entrambi sono NULL. Ma ho bisogno di usare l'input dall'interfaccia utente.

observe({ 
    print("in observe") 
    print(input$Product) 
    max_plots<-length(getTerm2UI(input$Desk, input$Product, input$File1)) 
    #max_plots<-5 
      # Call renderPlot for each one. Plots are only actually generated when they 
      # are visible on the web page. 
      for (i in 1:max_plots) { 
       # Need local so that each item gets its own number. Without it, the value 
       # of i in the renderPlot() will be the same across all instances, because 
       # of when the expression is evaluated. 
       local({ 
       my_i <- i 
       plotname <- paste("plot", my_i, sep="") 
       output[[plotname]] <- renderPlot({ 
        plot(1:my_i, 1:my_i, 
         xlim = c(1, max_plots), 
         ylim = c(1, max_plots), 
         main = paste("1:", my_i, ". n is ", input$n, sep = "")) 
       }) 
       }) 
      }##### End FoR Loop 
},priority = -1000) 

Qualche idea su come ottenere input $ Product e input $ File1 da compilare PRIMA di osservare le corse?

Grazie.

+1

'observ' ha un argomento' priority = 0'. Un osservatore con un determinato livello di priorità verrà sempre eseguito prima di tutti gli osservatori con un livello di priorità più basso. Puoi dare priorità negativa se vuoi che venga eseguito in un secondo momento. Questo può aiutare. – jdharrison

+0

Ho impostato la priorità a -100 e non succede nulla di diverso – user3022875

risposta

8

Il modo più semplice è aggiungere un controllo is.null(input$Product) nella parte superiore di ogni osservazione, per impedire che venga eseguito prima che gli input utilizzati vengano inizializzati.

Se non si desidera che gli osservatori eseguano il controllo null ogni volta che vengono eseguiti, è inoltre possibile utilizzare l'argomento suspended = TRUE durante la registrazione per impedirne l'esecuzione; quindi scrivi un osservatore separato che esegue il controllo e quando rileva che tutti gli input non sono nulli, le chiamate riprendono() sugli osservatori sospesi e si sospendono.

10

È necessario utilizzare Shiny Event Handler e utilizzare observeEvent anziché observe. Sembra essere l'unico modo per sbarazzarsi del messaggio "Errore non gestito" causato dai valori NULL all'avvio dell'app. Questo perché, a differenza di observe, il gestore eventi ignora i valori NULL per impostazione predefinita.

Così il vostro osservare funzione potrebbe finire cercando qualcosa di simile (senza bisogno di priorità, o riprendere/sospesi etc!)

observeEvent(input$Product, ({ 

    max_plots<-length(getTerm2UI(input$Desk, input$Product, input$File1)) 
    ... (etc)  

    })# end of the function to be executed whenever input$Product changes 
) 

non ho potuto copiare incollare il codice di esempio facilmente per farlo funzionare, in modo da Non sono del tutto sicuro di come sarebbe la tua funzione di osservazione completa.

0

avremmo bisogno di un MRE di dare una risposta di lavoro, ma, supponendo che è necessario input$Product e input$File1, ma non vogliono prendere una dipendenza su di loro, solo su input$Desk, si potrebbe:

observe({ 

    product <- isolate(input$Product) 
    file1 <- isolate(input$File1) 

    print("in observe") 
    print(product) 
    max_plots<-length(getTerm2UI(input$Desk, product, file1)) 
    for (i in 1:max_plots) { 
    # ... 
    } 
}) 

questo è probabilmente equivalente a un observeEvent(input$Desk, ....), ma potrebbe offrire una maggiore flessibilità.