2013-07-16 13 views
8

Powiedzmy mam następujący plik server.R w błyszczące:Ustaw globalny obiekt w błyszczące

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

Co mogę zrobić, aby nie uruchomić data2 <- data[data$x == input$z, ] w każdym wywołaniu uczynić? Jeśli I wykonaj następujące czynności, pojawia się „obiekt typu«zamknięcie»nie jest subsettable” Błąd:

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

Co zrobiłem źle?

Odpowiedz

17

data2 to funkcja, która zwraca wybrany podzestaw. Więc trzeba zadzwonić data2 i zapisywać dane wyjściowe do jakiejś zmiennej potem można wykreślić/podsumować różne kolumny

## 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) 
    }) 
}) 

Jeśli nie masz już, polecam przeczytanie http://rstudio.github.io/shiny/tutorial/#welcome. Strona dotycząca reaktywności dość dobrze odpowiada na to pytanie.

+0

Dzięki za pomoc, jestem bardzo nowy w Shiny (to mój drugi dzień z nim pracuje). Twoje rozwiązanie działa, ale nie wtedy, gdy wstawiam 'ifelse()' wewnątrz mojej procedury podzbioru, która jest w rzeczywistości czymś takim: 'dane2 <- reaktywne (ifelse (wejście $ z == '', dane, dane [dane x == input $ z,])) '. Kiedy to zrobię, pojawia się następujący błąd: 'Błąd w plot.window (xlim, ylim, log = log, ...): potrzebuję skończonych wartości 'xlim'. –

+0

BTW, mam już za sobą samouczek RStudio (przynajmniej podstawowe części) i zamierzam zagłębić się w to i dokumentacji pakietu z czasem. –

+2

@wleoncio ten błąd jest prawie na pewno dlatego, że przekazujesz puste 'dane.frame' do wykreślenia. Sugerowałbym wykonanie debugowania, aby dowiedzieć się, czy 'data2' zwraca to, czego się spodziewasz. Można również dodać kontrole w funkcji wyjściowej wydruku, takie jak 'if (nrow (newData) == 0) return()', która uniemożliwi jej wykreślenie, jeśli nie ma danych. Podczas gdy pracuję nad błyszczącą aplikacją, lubię dodawać tabelę, aby później zostać zakomentowana, która po prostu wydrukuje różne wartości debugowania (np. Liczba wierszy w bieżących danych, poziomy pewnej zmiennej itp.) –