2013-07-16 18 views
8

Diciamo che ho il seguente file server.R a lucido:Impostare oggetto globale in Shiny

shinyServer(function(input, output) { 
    output$plot <- renderPlot({ 
    data2 <- data[data$x == input$z, ] # subsetting large dataframe 
    plot(data2$x, data2$y) 
    }) 
    output$table <- renderTable({ 
    data2 <- data[data$x == input$z, ] # same subset. Oh, boy... 
    summary(data2$x) 
    }) 
}) 

Cosa posso fare per non dover correre data2 <- data[data$x == input$z, ] all'interno di ogni chiamata di rendering? Se faccio il seguente, ho un "oggetto di tipo 'chiusura' non è subsettable" Errore:

shinyServer(function(input, output) { 
    data2 <- reactive(data[data$x == input$z, ]) 
    output$plot <- renderPlot({ 
    plot(data2$x, data2$y) 
    }) 
    output$table <- renderTable({ 
    data2 <- data[data$x == input$z, ] 
    summary(data2$x) 
    }) 
}) 

Che cosa ho fatto di sbagliato?

risposta

17

data2 è una funzione che restituisce il sottoinsieme che si sta cercando. Quindi è necessario chiamare data2 e salvare l'output di una variabile, allora è possibile tracciare/riassumere le varie colonne

## data should be defined somewhere up here or in global.R 

shinyServer(function(input, output) { 
    data2 <- reactive(data[data$x == input$z, ]) 

    output$plot <- renderPlot({ 
    newData <- data2() 
    plot(newData$x, newData$y) 
    }) 

    output$table <- renderTable({ 
    newData <- data2() 
    summary(newData$x) 
    }) 
}) 

Se non lo hai già fatto, vi consiglio di leggere attraverso http://rstudio.github.io/shiny/tutorial/#welcome. La pagina sulla reattività risolve abbastanza bene questa domanda.

+0

Grazie per l'aiuto, sono molto nuovo per Shiny (è il mio secondo giorno di lavoro con esso). La tua soluzione funziona, ma non quando inserisco un 'ifelse()' all'interno della mia routine secondaria, che è in realtà qualcosa del tipo: 'data2 <- reactive (ifelse (input $ z == '', dati, dati [dati $ x == input $ z,])) '. Quando faccio questo, ottengo il seguente errore: 'Errore in plot.window (xlim, ylim, log = log, ...): necessita di valori 'xlim' finiti'. –

+0

BTW, ho terminato con il tutorial RStudio (almeno le parti di base) e intendo approfondire ulteriormente la documentazione del pacchetto con il tempo. –

+2

@wleoncio quell'errore è quasi certamente perché stai passando un 'data.frame' vuoto per tracciare. Quindi suggerisco di fare un po 'di debug per capire se 'data2' restituisce ciò che ti aspetti. Puoi anche aggiungere dei controlli nella funzione di output della trama come 'if (nrow (newData) == 0) return()' che impedirà di tracciare se non ci sono dati. Mentre sto lavorando su un'app lucida, mi piace aggiungere una tabella, per essere commentata in seguito, che stamperà solo diversi valori di debug (cioè il numero di righe nei dati correnti, i livelli di una certa variabile, ecc.) –