4 Reatividade

A função reactive é um recurso do pacote Shiny que permite a interação de maneira automática entre o ui e server.

4.1 Modelo de reactividade

Utilizando o Exemplo 3 (Capítulo 3) onde deseja-se que o aplicativo tenha a opção de elecionar uma das variáveis e em seguida obter o seu respectivo histograma. Para isso será necessário usar a função selectInput(). Antes uma revisão das etapas utilizadas na construção do aplicativo mostrado no Capítulo 3.

Construção da interface do usuário (ui).

ui <- fluidPage(
  titlePanel("Aplicativo Shiny com dataset IRIS"),
    sidebarLayout(
      sidebarPanel(
      h2("Aplicação não reativa"),
      p("Este exemplo mostra a interação entre UI e SERVER, 
      sem que tenha a necessidade de uma função reativa.")),

       mainPanel(
          tabsetPanel(
            tabPanel("Dados",tableOutput("dadosId")),
            tabPanel("Gráfico", plotOutput("plotId")),
            tabPanel("Summary", verbatimTextOutput("sumId"))
))))  

Construção do servidor (server)

server <- function(input, output){
  output$dadosId <- renderTable(head(dados))

  
  output$plotId <- renderPlot({
    hist(Sepal.Width, col = "red")})
  
  output$sumId <- renderPrint(summary(dados))

  } 

E por fim, o código que gera o app em uma nova seção do RStudio.

shinyApp(ui = ui, server = server)

A função selectInput() permitirá a construção de uma lista de opções e nesta lista será incluído todas as variáveis quantitativas do dataset iris, conforme exemplo abaixo.

4.2 Recurso reativo

Adcionando um recurso reativo (ui).

selectInput("dataset", "Escolha uma variável",
      c("Sepal.Length","Sepal.Width",
      "Petal.Length","Petal.Width"))

Criando a função reativa (server).

datasetInput <- reactive({
    switch(input$dataset,
           "Sepal.Length" = Sepal.Length,
           "Sepal.Width" = Sepal.Width,
           "Petal.Length" = Petal.Length,
           "Petal.Width" = Petal.Width)
  })

A função reativa foi criada e salva em objeto chamado datasetInput onde recebe input$dataset que imputa os valores criados no ui e salvo na lista dataset. Os valores a esquerda e entre aspas são os valores que aparecerá para o usuário, e os valores a direita são os valores das variáveis conforme descritas no dataset.

Após criar a função reactive será necessário ajustar os output .

output$dadosId <- renderTable({
    head(dados)})
output$plotId <- renderPlot({
    Sepal.Length <-  hist(datasetInput(), col = "red", 
    ylab = "Frequência", xlab = input$dataset, 
    main = c("Histograma de ",input$dataset ))

    })
output$sumId <- renderPrint(summary(datasetInput()))

Observe que ao realizar a plotagem do histograma em xlab foi atribuído o valor input$dataset que altera o valor no eixo x do histograma toda a vez que a variável for alterada, o mesmo ocorre para o título do histograma.

Gerando o aplicativo.

shinyApp(ui = ui, server = server)

Código completo do aplicativo usando a reactividade.

ui <- fluidPage(
  titlePanel("Aplicativo Shiny com dataset IRIS"),
             sidebarLayout(
        sidebarPanel(
        h2("Aplicação reativa"),
        p("Este exemplo mostra a interação entre UI e SERVER, 
        usando uma função reativa."),
        selectInput("dataset", "Escolha uma variável",
                    c("Sepal.Length","Sepal.Width",
                      "Petal.Length","Petal.Width"))
        ),
        

               mainPanel(
                 tabsetPanel(
                   tabPanel("Dados",tableOutput("dadosId")),
                   tabPanel("Gráfico", plotOutput("plotId")),
                   tabPanel("Summary", verbatimTextOutput("sumId"))
   )
  )
 )
)


server <- function(input, output){
  
  
datasetInput <- reactive({
  switch(input$dataset,
          "Sepal.Length" = Sepal.Length,
          "Sepal.Width" = Sepal.Width,
          "Petal.Length" = Petal.Length,
          "Petal.Width" = Petal.Width)
  })
  
  
output$dadosId <- renderTable({
  head(dados)})

  
output$plotId <- renderPlot({
  Sepal.Length <-  hist(datasetInput(), col = "red", 
        ylab = "Frequência",  xlab = input$dataset,
        main = c("Histograma de ",input$dataset ))
})
  
output$sumId <- renderPrint(summary(datasetInput()))

}   
shinyApp(ui = ui, server = server)

O resultado da aplicação pode ser observado na Figura 4.1.

Aplicação Shiny com uso da função **reactive()**.

Figure 4.1: Aplicação Shiny com uso da função reactive().

Fonte: Elaborado pela autora.

Ao alterar as opções, o histograma será modificado de acordo com a variável selecionada, conforme mostra a Figura 4.2 quando é selecionado a variável Sepal.Length.

Aplicação Shiny com uso da função **reactive()**.

Figure 4.2: Aplicação Shiny com uso da função reactive().

Fonte: Elaborado pela autora.

Copie o código para o seu RStudio e teste você mesmo.

A seguir é disponibilizado dois links de aplicativos interativo usando a linguagem R e Python para base de dados utilizada no capítulo 5.