2014-09-23 7 views
6

Mój wykres ggvis zależy od kilku pól wejściowych, które działają jak filtr danych wejściowych. W przypadku niektórych kombinacji wynikowa ramka danych jest pusta, a ggvis zgłasza błąd i przerywa całą aplikację. Próbowałem wstawićWłaściwy sposób na powrót z ggvis, gdy dane są puste?

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

który nie pomógł. Jaki jest właściwy parametr powrotu w tej sytuacji (chcę zamiast tego mieć pustą fabułę lub jakąś wiadomość tekstową)?

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

Aktualizacja

Nie chcę, aby pokazać wszystkie dane, gdy dane jest pusta (jak sugeruje here) To mylące

+0

Jestem również zainteresowany tym. Właśnie warunkowo podawam dane.frame z tymi samymi kolumnami i zerami. Powinieneś móc używać 'conditionalPanel' w pliku ui.R, który analizuje reaktywny ciąg wskazujący, czy data.frame jest pusty, ale nie zawsze działa w moim przypadku. – ideamotor

+0

Twój link "tutaj" był mi pomocny w przeszłości. Sprawdziłbym też link do aplikacji, z którą pracowała w komentarzach. Czy masz kontrolę wprowadzania danych w swoim interfejsie użytkownika? Powinieneś przetestować, że istnieją w server.r – miles2know

+0

@ miles2know thanks for pointing to comments. Rzeczywiście, spojrzałem na jej kod i znalazłem funkcję sprawdzania poprawności(), o której nie wiedziałem - http://shiny.rstudio.com/articles/validation.html Ale nadal nie działa dla ggvis – RInatM

Odpowiedz

3

w moim przypadku, z najnowszym błyszczący, ja może po prostu wysłać n pusta data.table (lub data.frame) i lśniąca tylko kreślenie pustego wykresu (data.frame lub data.table musi mieć odpowiednie kolumny)

+0

Czy masz również możliwość pracy ze zdalnymi tabelami 'dplyr'? Nie mogę odtworzyć przykładowej przyczyny, nie znam żadnej publicznej bazy danych, której mógłbym użyć, ale pojawia się następujący błąd, gdy tbl nie jest lokalnym błędem w UseMethod ("prop_type"): brak stosowanej metody dla "prop_type" zastosowanej do obiekt klasy "c" ("tbl_mysql", "tbl_sql", "tbl_lazy", "tbl") "' – Dambo

+0

dzięki za odpowiedź, to właśnie zrobiłem, aby rozwiązać podobną sytuację w mojej aplikacji, ale chciałbym dodać, że musisz zwrócić obiekt ggvis, a nie data.frame. może to, co miałeś na myśli, ale musiałem walczyć trochę więcej, aby to uzyskać, więc zamiast zwracania 'NULL' musisz zwrócić pustą ramkę danych z tymi samymi kolumnami, a następnie użyć dplyr do utworzenia ggvis' data.frame (col1 = '', col2 = '')%>% ggvis (~ col1, ~ col2)%>% layer_points() '+ za odpowiedź :) – ghub24

4

Więc to by było pomocne, aby zobaczyć więcej logiki w twoim kodzie. Sądzę, że ogólnie rzecz biorąc, bardzo ważne jest zrozumienie, jak wyrażenia reaktywne działają w kontekście logiki programu. Próbowałbym czytać jak najwięcej kodu na błyszczącej stronie głównej. Oto krótki skrypt, który napisałem, myślę, że dostaje to, o co prosisz. Twoje zdrowie.

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

dziękuję za ten fragment, przekonał mnie, że to nie jest sam ggviz, ale tylko%>% layer_smooths() jest odpowiedzialny za złamanie kodu Jeśli dodasz%>% layer_smooths() do twojego wykresu, twoje obejście nie działa i przerwy w aplikacji. Zgłosiłem problem, ale pozostaje pytanie - jak nie uruchomić ggvis, gdy dane są puste – RInatM

+0

Cześć. To mnie nie zaskakuje. Nie miałem problemów z kręceniem twojego kodu ggvisa. Właśnie wrzuciłem jakiś stary kod, który leżałem w pobliżu, który zadziałał. Wydawało mi się, że próbujesz użyć lśnienia i dowiedzieć się, jak go nie złamać, gdy filtry są puste. Właśnie to robiłem. Więc jeśli nie rozumiem cię, powyższy kod zapewnia drogę naprzód na tym froncie.Ponownie, chociaż mój przykład powyżej nie miał na celu wykazania czegoś szczególnego dla ggvis per se. powodzenia. – miles2know

+0

Funkcja "obserwuj()" była dla mnie brakującym elementem. Twoje zdrowie. –

Powiązane problemy