Thomas Rosa
Thomas Rosa

Reputation: 742

Issue with R shiny's DT::dataTableOutput() forcing unnecessary reactivity updates

I'm working on an R shiny app structured like this:

library(shiny)
library(DT)

# global function
make_data = function(input){
  data.frame(x = input$x, `x_times_2` = input$x*2)
}

ui <- fluidPage(
  sliderInput("x", label = "Set x:", min = 1, value = 7, max = 10),
  # Recalculates continuously, bad!
  dataTableOutput("dtab"),
  # Recalculates when inputs change, good!
  # tableOutput("tab")
)

server <- function(input, output, session) {
  reactive_data = reactive({
    print("Recalculating Data")
    make_data(reactiveValuesToList(input))
  })

  output$tab = renderTable({
    reactive_data()  
  })

  output$dtab = renderDataTable({
    reactive_data()  
  })

}
shinyApp(ui, server)

My problem is that dataTableOutput("dtab") forces continuous recalculation of reactive_data whereas tableOutput("tab") (correctly) only recalculates when inputs change. Can someone help me understand why this happens?

I need to be able to pass inputs into a global function that makes a data frame which I then need to display. I want to use dataTableOutput() for the customization that DT offers but need it to only recalculate when any input is changed.

Upvotes: 2

Views: 246

Answers (1)

YBS
YBS

Reputation: 21349

In this situation, you could use eventReactive() instead of reactive. Try this

  reactive_data = eventReactive(input$x, {
    print("Recalculating Data")
    make_data(reactiveValuesToList(input))
  })

Upvotes: 1

Related Questions