Desafio #2: contador de cliques [Shiny]

Os desafios da Curso-R são problemas práticos de análise de dados e programação envolvendo faxina de dados, construção de gráficos, relatórios em RMarkdown, modelagem, aplicativos Shiny e muito mais.

O intuito é praticar as diversas etapas da Ciência de Dados, interagir com a comunidade compartilhando as suas soluções e gerar bastante repertório.

Vale sempre lembrar que:

  • Não existe uma única solução para o desafio.

  • Você pode usar qualquer linguagem de programação e quaisquer ferramentas/pacotes da linguagem.

  • Não existe a melhor solução. Toda solução é válida. No dia-a-dia o importante é resolver o problema.

Este tópico é dedicado para soluções, dúvidas e comentários sobre o Desafio 2: contador de cliques [Shiny].

2 curtidas

Olá!

Parecia tão simples mas quebrei a cabeça pra conseguir resolver haha, e pesquisei bastante coisa nas internet da vida.

A parte que achei mais complicada foi a questão do tempo, não consegui estruturar algo com Sys.time(), então pesquisando mais ainda encontrei o pacote tictoc que facilitou o armazenamento de tempo entre as ações.

Já para o contador em si usei a documentação do shiny + passagens das aulas do curso de Shiny 1 + exemplos aleatórios, ai deu boa de fazer.

O layout ficou super simples, porque o sofrimento ficou no código ahahaha.

Mas foi divertido fazer, segue abaixo minha resolução:

Obs: considerei um tempo de 2 segundos para “resetar” a contagem de cliques.

library(shiny)

# Ui ----------------------------------------------------------------------
  
ui <- fluidPage(
    
    
    h2("Curso R - Desafio 2: Botão de contagem em Shiny"),
    h3("Autor: Maykon G. Pedro"),
    sidebarLayout(
        
        sidebarPanel = sidebarPanel(
            
            #  input -> botão para clicar
            actionButton(
                inputId = "botao",
                label = "Clique aqui",
                class = "btn-success"
            )
            
        ),
        
        mainPanel = mainPanel(
            # output de texto
            htmlOutput(outputId = "texto")
        )
    )
  
)

# Server ------------------------------------------------------------------

server <- function(input, output, session) {

  # contador para cada vez que o botão é clicado
  contador <- reactiveVal(0)
  
  # tempo entre as contagens
  time <- reactiveVal()
  
  observeEvent(
    input$botao, {
      
      # contador
      cont <- contador() # recebe o valor reativo
      contador(cont + 1) # atualiza pra cada vez que o botão é clicado
      
      # tempo
      time(capture.output(tictoc::toc()))
      tictoc::tic()
      
      # condição
      # necessário usar o shiny::req para não estourar erro na primeira rodada
      if (req(time()) > 2) { 
      
        contador(0)
        # print("passei por aqui")
      }
      
      }
  )
  
  # output -> contador que imprime os cliques
  output$texto <- renderUI({

    shiny::HTML(
      
      paste0(
        "Quantidade de vezes que você clicou no botão: ",
        "<b>", contador(), "</b>",
        "<br/>",
        "Tempo entre cliques: ",
        "<b>", time(), "</b>"
      )
    )
    
  })
  
}

shinyApp(ui, server)

Created on 2022-03-30 by the reprex package (v2.0.1)

Fontes/pesquisas/material utilizado:
[1] 6 simple Shiny things I have learned from creating a somewhat small app – Albert Rapp (albert-rapp.de)
[2] Time interval between clicks on the same button - shiny R - Stack Overflow
[3] R: Package tictoc. Functions tic toc for timing R scripts (collectivemedia.github.io)
[4] Shiny - Check for required values — req (rstudio.com)
[5] Shiny - Using Action Buttons (rstudio.com)
[6] Dashboards com R (curso-r.github.io)

3 curtidas