asdf1212
asdf1212

Reputation: 411

Shiny - Data Table - click on actionButton twice

I've this Shiny App:

library(shiny)
library(DT)


ui <- fluidPage(
  fluidRow(
    DT::dataTableOutput(outputId = "my_data_table"),
  )
)


server <- function(input, output) {
  
  myValue <- reactiveValues(check = '')
  
  shinyInput <- function(FUN, len, id, ...) {
    inputs <- character(len)
    for (i in seq_len(len)) {
      inputs[i] <- as.character(FUN(paste0(id, i), ...))
    }
    inputs
  }
  
  
  my_data_table <- reactive({
    tibble::tibble(
      Name = c('Dilbert', 'Alice', 'Wally', 'Ashok', 'Dogbert'),
      Motivation = c(62, 73, 3, 99, 52),
      Actions = shinyInput(actionButton, 5,
                           'button_',
                           label = "Fire",
                           onclick = paste0('Shiny.onInputChange( \"select_button\" , this.id)') 
      )    
    )
  })
  
  output$my_data_table <- renderDataTable({
    my_data_table()
  }, escape = FALSE)
  
  
  observeEvent(input$select_button, {
    print(input$select_button)
  })
  
  
  
  
}

shinyApp(ui, server)

Every time I click on "fire" - it is print the row number of the button. It is works well, but if I click on the some button twice - it is only print the first click. I want to print it every time I click on the button, also if I click N times on the some row.

any suggestion will be welcome..

Upvotes: 1

Views: 378

Answers (1)

Marcus
Marcus

Reputation: 3636

Communicating with Shiny : you need to switch the priority from values to event. Otherwise it assumes, because the value of your message hasn't changed (i.e. the id of the button), no message gets sent. There is third argument to Shiny.onInputChange which takes an options object (e.g. {priority: "event"}) which will send a message everytime the button is clicked, even the same id twice in a row.

onclick js code should be

onclick = paste0('Shiny.onInputChange( \"select_button\" , this.id, {priority: "event"})') 

Upvotes: 5

Related Questions