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_data
而 tableOutput("tab")
(正确地)仅在输入更改时重新计算。谁能帮我理解为什么会这样?
我需要能够将输入传递给一个全局函数,该函数生成一个数据框,然后我需要显示该数据框。我想将 dataTableOutput()
用于 DT
提供的自定义,但需要它仅在任何输入更改时重新计算。
在这种情况下,您可以使用 eventReactive()
而不是 reactive
。试试这个
reactive_data = eventReactive(input$x, {
print("Recalculating Data")
make_data(reactiveValuesToList(input))
})
我正在开发结构如下的 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_data
而 tableOutput("tab")
(正确地)仅在输入更改时重新计算。谁能帮我理解为什么会这样?
我需要能够将输入传递给一个全局函数,该函数生成一个数据框,然后我需要显示该数据框。我想将 dataTableOutput()
用于 DT
提供的自定义,但需要它仅在任何输入更改时重新计算。
在这种情况下,您可以使用 eventReactive()
而不是 reactive
。试试这个
reactive_data = eventReactive(input$x, {
print("Recalculating Data")
make_data(reactiveValuesToList(input))
})