Server side

Com a interface do usuário estruturada, precisamos agora implementar a função server(). Nela, colocaremos as instruções para gerar os outputs que nós vemos no user side a partir dos valores dos inputs que o usuário escolher.

A primeira coisa que precisamos fazer é defini-la. A função server() será sempre uma função que recebe dois argumentos: input e output.

server <- function(input, output) {

  # Código

}

A partir daí, precisamos seguir três regras:

  1. Todos os outputs estão numa lista chamada output. Assim, como no exemplo do histograma nós chamamos o gráfico de hist, para nos referirmos a ele no server side utilizaremos output$hist.

  2. Os outputs devem ser construídos com funções render_(). Existe uma função render_() para cada tipo de objeto. As principais são:

  3. renderDataTable() - data frames.

  4. renderImage() - imagens.
  5. renderPlot() - gráficos.
  6. renderPrint() - qualquer printed output.
  7. renderTable() - data frames, matrizes, e outras estruturas em forma de tabela.
  8. renderText() - strings.
  9. renderUI() - um elemento do UI ou HTML.

O argumento dessas funções será sempre um bloco de código, usado para gerar o output desejado. Repare que para gerar o histograma, utilizamos a função renderPlot().

  1. Da mesma forma que os outputs, todos os inputs estão numa lista chamada input. Assim, para acessar o valor escolhido para o número de classes no exemplo do histograma, utilizaremos input$classes.

Agora já conseguimos entender o código do nosso exemplo.

server <- function(input, output) {

  output$distPlot <- renderPlot({

    x    <- mtcars$mpg
    bins <- seq(min(x), max(x), length.out = input$classes + 1)

    hist(x, breaks = bins, col = "#75AADB", border = "white",
         xlab = "Milhas por galão",
         main = "Histograma do número de milhas rodadas por galão de combustível.")

  })

}

Repare nas {} dentro da função renderPlot(). Elas permitem que qualquer estrutura de código possa ser passada como argumento. Podemos então pular linhas e indentar nosso código normalmente dentro das funções render_().

Sempre que você usar um input dentro de uma função render_(), o seu output se tornará reativo ao valor do input. Isso significa que, sempre que o usuário mudar o valor do input, o Shiny atualizará automaticamente o valor dentro da lista e também todas as funções render_() que dependam dele.

No nosso exemplo, sempre que o usuário mudar o número de classes no slider, o aplicativo atualizará o valor de input$classes e rodará novamente o código dentro da função renderPlot(). Assim, o objeto output$hist será atualizado.

A reatividade é um princípio essencial dentro do Shiny, e saber usá-la é primordial para que o aplicativo funcione corretamente e de forma eficiente. A seguir, exploraremos mais a fundo esse conceito e apresentaremos funções que auxiliam a manipular a reatividade.



curso-r/pu.shiny documentation built on May 18, 2019, 8:07 p.m.