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:
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
.
Os outputs devem ser construídos com funções render_()
. Existe uma função render_()
para cada tipo de objeto. As principais são:
renderDataTable()
- data frames.
renderImage()
- imagens.renderPlot()
- gráficos.renderPrint()
- qualquer printed output.renderTable()
- data frames, matrizes, e outras estruturas em forma de tabela.renderText()
- strings.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()
.
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.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.