2014-09-23 11 views
6

Il mio grafico ggvis dipende da diversi campi di input che funzionano come filtri per i dati di input. Per alcune combinazioni il frame dati risultante è vuoto e ggvis genera un errore e interrompe l'intera applicazione. Ho provato a mettereUn modo corretto per tornare da ggvis quando i dati sono vuoti?

if(nrow(inputdataframe) == 0) return NULL 
if(nrow(inputdataframe) == 0) return ggvis() 

che non ha aiutato. Qual è il parametro di ritorno corretto in questa situazione (voglio invece avere una trama vuota o qualche messaggio di testo)?

server.R

effvis <- reactive ({ 
     dta <- siteeff() 
     if(nrow(dta) == 0) return(NULL) 
     dta %>% 
      ggvis(~param.value, ~yvar) %>% 
      layer_points(size := 50, size.hover := 200) %>% 
      set_options(width = 800, height = 500) 
}) 
effvis %>% bind_shiny("effplot") 

ui.R -

ggvisOutput("effplot") 

Aggiornamento

Io non voglio mostrare tutti i dati quando i dati è vuoto (come suggerito here) È confuso

+0

Sono interessato anche a questo. Nutro solo condizionatamente un data.frame con le stesse colonne e zeri. Dovresti essere in grado di usare 'conditionalPanel' in ui.R che guarda una stringa reattiva che indica se data.frame è vuoto, ma non sempre funziona nel mio caso. – ideamotor

+0

Il tuo link "qui" mi è stato utile in passato. Controllerei anche il link all'app che ha funzionato nei commenti. Hai comandi di input nel tuo ui? Dovresti testare che esistono sul server.r – miles2know

+0

@ miles2 grazie per aver indicato i commenti. Infatti, ho guardato il suo codice e trovato la funzione validate(), che non sapevo - http://shiny.rstudio.com/articles/validation.html Ma ancora, non sembra funzionare per ggvis – RInatM

risposta

3

Nel mio caso, con l'ultimo lucido, mi può solo inviare un n vuoto data.table (o data.frame) e lucido semplicemente traccia un grafo vuoto (il data.frame o data.table deve avere le colonne corrispondenti)

+0

Hai funzionato anche con i tavoli 'dplyr' remoti? Non riesco a riprodurre l'esempio perché non conosco nessun db pubblico che potrei usare, ma ottengo il seguente errore quando il tbl non è locale 'Errore in UseMethod (" prop_type "): nessun metodo applicabile per 'prop_type' applicato a un oggetto di classe "c ('tbl_mysql', 'tbl_sql', 'tbl_lazy', 'tbl')" ' – Dambo

+0

grazie per la risposta questo è quello che ho fatto per risolvere una situazione simile nella mia applicazione ma vorrei aggiungere che devi restituire un oggetto ggvis non data.frame. forse quello che intendevi, ma ho dovuto fare ancora un po 'di fatica per ottenerlo, quindi invece di ridimensionare 'NULL' devi restituire un data.frame vuoto con le stesse colonne e poi usare dplyr per creare ggvis' data.frame (col1 = '', col2 = '')%>% ggvis (~ col1, ~ col2)%>% layer_points() '+ per la risposta :) – ghub24

4

Quindi sarebbe stato utile per vedere un po 'più della logica nel codice. Credo che direi in generale che è molto importante capire come le espressioni reattive funzionano nel contesto della logica del programma. Proverò a leggere più codice possibile sulla pagina iniziale lucida che puoi. Ecco una breve sceneggiatura che ho scritto e penso che arrivi a quello che stai chiedendo. Saluti.

Global.r

library(plyr) 
    library(dplyr) 

    exp <- data.frame(Ind=rep(c("a","b"),each=50),val1=rgamma(100,10,5),val2=rnorm(100,2,3.5))

Server.r

library(shiny) 
    library(ggvis) 

    shinyServer(function(input, output, session) { 

    output$selectO <- renderUI({ selectInput(inputId="selectI", label = h4("Level to Plot"), 
     choices = list("a","b","c"),selected="a") 
    }) 

    observe({ 

    if(!is.null(input$selectI)){ 

    expfilter <- reactive({ 
      vals <- exp %>% filter(Ind == input$selectI) 
      return(vals) 
    }) 

    if(nrow(expfilter())==0){ 

    fail <- reactive({ return("filter failed") }) 

    output$trouble <- renderText({fail()}) # notice the use of() since fail is a function. when you want to grab the values of reactives use the() 

    } else { 

    success <- reactive({ return("good") }) 

    output$trouble <- renderText({success()}) 

    P1 <- reactive({ 
     expfilter %>% ggvis(~val1, ~val2) %>% 
     add_axis("x",title="Var1",title_offset=45,properties=axis_props(labels=list(fontSize = 13, fontWeight = "bold"),title=list(fontSize = 15))) %>% 
     add_axis("y",properties=axis_props(labels=list(fontSize = 13, fontWeight = "bold"))) 
    }) 

    P1 %>% bind_shiny("plot1") 

     } 
     } 
    }) 
    }) 


ui.r

library(shiny) 

    shinyUI(fluidPage(
    column(3, 
     wellPanel(
     uiOutput("selectO") 
     ) 
    ), 
    column(9, 
     wellPanel(
     ggvisOutput("plot1")), 
     wellPanel(h6("How Did the Filter Do"), 
     textOutput("trouble") 
     ) 
    ) 
    ) 
    ) 
+0

grazie per questo frammento, mi ha fatto capire che non è ggviz da solo, ma solo%>% layer_smooths() è responsabile della rottura del codice Se aggiungi%>% layer_smooths() al tuo grafico, la tua soluzione non funziona e le interruzioni dell'applicazione. Ho inviato un problema, ma la domanda rimane: come non lanciare ggvis quando i dati sono vuoti – RInatM

+0

Ciao. Questo non mi sorprende. Non ho avuto problemi nel girare il tuo codice ggvis, ho appena inserito un codice vecchio che avevo trovato in giro. Mi è sembrato che tu stia cercando di usare la lucentezza e capire come non farlo interrompere quando i tuoi filtri vengono visualizzati vuoti. Questo è quello che stavo ottenendo. Quindi, a meno che non ti fraintenda, il codice di cui sopra fornisce una soluzione su questo fronte.Anche se il mio esempio sopra non era inteso a dimostrare qualcosa di particolare per ggvis in sé. buona fortuna. – miles2know

+0

La funzione 'observ()' era il pezzo mancante per me. Saluti. –

Problemi correlati