R shiny 的 DT::dataTableOutput() 强制进行不必要的反应性更新的问题

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

我正在开发结构如下的 R shiny 应用程序:

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)

我的问题是 dataTableOutput("dtab") 强制连续重新计算 reactive_datatableOutput("tab") (正确地)仅在输入更改时重新计算。谁能帮我理解为什么会这样?

我需要能够将输入传递给一个全局函数,该函数生成一个数据框,然后我需要显示该数据框。我想将 dataTableOutput() 用于 DT 提供的自定义,但需要它仅在任何输入更改时重新计算。

在这种情况下,您可以使用 eventReactive() 而不是 reactive。试试这个

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