Jak umieszczać wyniki analiz w aplikacji?
W poprzedniej części zobaczyliśmy jak wygląda struktura aplikacji. Jednak aplikacja, którą zbudowaliśmy nie robi nic ciekawego.
Zbudujmy teraz aplikację, która coś liczy i wyświetla to coś na ekranie. W przypadku poniższej aplikacji wynikiem będą dwa elementy: wykres i opis modelu liniowego.
Opisaną poniżej aplikację można zobaczyć pod adresem Przewodnik/shiny1. Kody źródłowe dostępne są pod adresem github/shiny1.
Dodanie wyników do aplikacji wymaga zmiany obu części deklaracji aplikacji. W pliku ui.R
należy określić gdzie ma zostać umieszczony określony wynik, a w pliku server.R
należy określić jak ma być liczony.
Zacznijmy od pliku ui.R
.
Poniżej wklejamy uaktualnioną treść tego pliku. W miejscu gdzie tworzony jest prawy panel znalazły się wywołania dwóch funkcji
plotOutput()
, wskazującej gdzie ma zostać umieszczony wykres o nazwietrend
,verbatimTextOutput()
, wskazującej gdzie ma zostać umieszczony opis o nazwiemodel
.
Funkcje osadzające obiekty w interfejsie html mają nazwy określające co jest osadzane (wykres, tabela, opis obiektu, strona html) i kończące się słowem Output
.
library(shiny)
shinyUI(fluidPage(
titlePanel("Oceny kolejnych odcinków serialu 'Przyjaciele'"),
sidebarLayout(
sidebarPanel(
p("Tutaj jest lewy panel")
),
mainPanel(
plotOutput("trend"),
verbatimTextOutput("model")
)
)
))
W pliku server.R
muszą znaleźć się instrukcje tworzące obiekty trend
i model
.
Treść tego pliku przedstawiona jest poniżej. Istotne deklaracje doklejane są do listy output$
. W przypadku obiektu trend
jest on produkowany przez wyrażenie przekazane do funkcji renderPlot()
. To wyrażenie tworzy wykres z użyciem pakietu ggplot2
.
W przypadku modelu liniowego jest on tworzony wewnątrz funkcji renderPrint()
.
library(PogromcyDanych)
library(ggplot2)
shinyServer(function(input, output) {
output$trend = renderPlot({
przyjaciele <- serialeIMDB[serialeIMDB$serial == "Friends", ]
ggplot(przyjaciele, aes(id, ocena, size=glosow, color=sezon)) +
geom_point() + xlab("Numer odcinka")
})
output$model = renderPrint({
przyjaciele <- serialeIMDB[serialeIMDB$serial == "Friends", ]
summary(lm(ocena~id, przyjaciele))
})
})