2014-09-23 8 views
6

Mein ggvis-Diagramm hängt von mehreren Eingabefeldern ab, die wie Filter für Eingabedaten funktionieren. Für einige Kombinationen ist der resultierende Datenrahmen leer und ggvis wirft einen Fehler und bricht die gesamte Anwendung. Ich versuchteRichtiger Weg von ggvis zurückzukehren, wenn die Daten leer sind?

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

zu setzen, die nicht geholfen haben. Was ist der richtige Rückgabeparameter in dieser Situation (Ich möchte stattdessen eine leere Handlung oder eine Textnachricht haben)?

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") 

aktualisieren

Ich möchte nicht alle Daten zeigen, wenn Daten leer ist (wie here vorgeschlagen) Es ist verwirrend

+0

Das interessiert mich auch. Ich füge nur einen Datenrahmen mit den gleichen Spalten und Nullen bedingt ein. Sie sollten 'conditionalPanel' in ui.R verwenden können, das eine reaktive Zeichenfolge anzeigt, die angibt, ob data.frame leer ist, aber in meinem Fall nicht immer funktioniert. – ideamotor

+0

Ihr "hier" Link war mir in der Vergangenheit hilfreich. Ich würde auch den Link zu der App sehen, die sie in den Kommentaren bearbeitet hat. Haben Sie in Ihrem UI Eingabesteuerungen? Sie sollten testen, dass diese in server.r – miles2know

+0

@ miles2know Dank für das Zeigen auf Kommentare vorhanden sind. In der Tat schaute ich auf ihren Code und fand validate() -Funktion, die ich nicht kannte - http://shiny.rstudio.com/articles/validation.html Aber immer noch scheint es nicht zu arbeiten ggvis – RInatM

Antwort

3

In meinem Fall, mit der neuesten glänzend, ich kann einfach senden n leere data.table (oder data.frame) und glanz nur ein leeres Diagramm plotten (die data.frame oder data.table muss die entsprechenden Spalten haben)

+0

Haben Sie es mit Remote-'dplyr' Tabellen zu arbeiten? Ich kann die Beispielursache nicht wissen, die ich keine öffentliche db verwenden konnte, aber ich erhalte den folgenden Fehler, wenn das tbl nicht lokal 'ist Fehler in UseMethod (" prop_type "): keine anwendbare Methode für 'prop_type' angewandt auf ein Objekt der Klasse "c ('tbl_mysql', 'tbl_sql', 'tbl_lazy', 'tbl')" ' – Dambo

+0

danke für die Antwort das ist, was ich getan habe, um eine ähnliche Situation in meiner Anwendung zu lösen, aber ich möchte das hinzufügen Sie müssen ein ggvis-Objekt und nicht data.frame zurückgeben. vielleicht, was du meintest, aber ich musste mich ein bisschen mehr anstrengen, um das zu bekommen, also musst du stattdessen ein leeres data.frame mit den gleichen Spalten zurückgeben und dplyr verwenden, um ggvis 'data.frame (col1 = '', col2 = '')%>% ggvis (~ col1, ~ col2)%>% layer_points() '+ für die Antwort :) – ghub24

4

So wäre es gewesen hilfreich, um mehr von der Logik in Ihrem Code zu sehen. Ich denke, im Allgemeinen ist es wirklich wichtig zu verstehen, wie reaktive Ausdrücke im Kontext der Programmlogik funktionieren. Ich würde versuchen, so viel Code auf der glänzenden Homepage zu lesen, wie du kannst. Hier ist ein kurzes Drehbuch, das ich geschrieben habe, dass ich glaube, dass es bei dem ankommt, was du fragst. Prost.

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

danke für dieses snippet, es hat mich höllisch zu erkennen, dass es nicht ggviz allein ist, aber nur%>% layer_smooths() ist verantwortlich für den breach der code Wenn Sie%>% layer_smooths() zu Ihrem Diagramm hinzufügen, Ihre Problemumgehung funktioniert nicht und die Anwendung bricht. Ich habe ein Problem eingereicht, aber die Frage bleibt - wie ggvis nicht starten, wenn die Daten leer sind – RInatM

+0

Hallo. Das überrascht mich nicht. Ich hatte keine Probleme damit, deinen ggvis-Code zu schießen. Ich habe einfach irgendeinen alten Code, den ich herumliegen hatte, reingetan, der funktioniert hat. Es sah für mich so aus, als ob du es glänzend nutzen würdest und finde heraus, wie du es nicht kaputt machen kannst, wenn deine Filter leer sind. Das war es, worauf ich hinauswollte. Also, wenn ich Sie nicht falsch verstehe, bietet der obige Code einen Weg vorwärts an dieser Front.Auch wenn mein Beispiel oben nichts über ggvis an sich darstellen sollte. viel Glück. – miles2know

+0

Die 'observe()' Funktion war das fehlende Stück für mich. Prost. –

Verwandte Themen