【问题标题】:Initializing and updating a reactive (data.table) in Shiny?在 Shiny 中初始化和更新反应式(data.table)?
【发布时间】:2018-08-02 10:27:18
【问题描述】:

是否有可能初始化闪亮的反应? 我想要一个反应性的data.table。此 data.table 的一部分不会更改,因此每次输入更改时我都不需要重新初始化它,而只需要更新列“original_values”和“working_values”。

这可能吗?或者这是case for better using reactiveValues() with observe(),即使我是calculate values here and do not have sideeffects

library(shiny)
library(data.table)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      sliderInput("slider1", "Slider 1",min = 0.1, max = 1, value = 0.4, step = 0.05),
      sliderInput("slider2", "Slider 2",min = 0.1, max = 1, value = 0.4, step = 0.05),                               
      sliderInput("slider3", "Slider 3",min = 100, max = 20000, value = 5000, step= 200)
    ), 
    mainPanel(
      tableOutput("tableOut")

    )

  ))

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

      #initalization - can this be put somewhere else?
      ret <- data.table(slider_names= c("slider1","slider2", "slider3"), 
                        some_grouping_information=c("A", "A", "B") )

      #actual reactive
      ret[,original_values :=c(input$slider1,input$slider2,input$slider3)]
      ret[,working_values:=sum(original_values), by=some_grouping_information]

    })

    output$tableOut<- renderTable(rv_dtWeights())

  }
  shinyApp(ui = ui, server=server)

【问题讨论】:

  • @JulienNavarre:不,不是。相似之处就是答案:我可以使用 data.table 作为全局变量,并且可以使用响应式扩展它。但这只是答案。
  • 以防万一有人来这里想知道为什么反应性不适用于 data.table(正如我在发布此问题时所做的那样):请参阅 github.com/rstudio/shiny/issues/1017stackoverflow.com/questions/32536940/…
  • data.table 包中的 := 已经过时,当它与 Shiny 的复杂性一起出现时,可能会让 R 初学者非常困惑。

标签: r shiny data.table


【解决方案1】:

您可以将其放在reactive 之外和server 中(或server 之外,有关差异的更多信息,请参阅here)。下面给出一个示例,其中data.table 仅在用户打开应用时初始化一次。

希望这会有所帮助!

library(shiny)
library(data.table)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      sliderInput("slider1", "Slider 1",min = 0.1, max = 1, value = 0.4, step = 0.05),
      sliderInput("slider2", "Slider 2",min = 0.1, max = 1, value = 0.4, step = 0.05),                               
      sliderInput("slider3", "Slider 3",min = 100, max = 20000, value = 5000, step= 200)
    ), 
    mainPanel(
      tableOutput("tableOut")

    )

  ))

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

  #initalization - can this be put somewhere else?
  ret <- data.table(slider_names= c("slider1","slider2", "slider3"), 
                    some_grouping_information=c("A", "A", "B") )


  rv_dtWeights <- reactive({
    #actual reactive
    ret[,original_values :=c(input$slider1,input$slider2,input$slider3)]
    ret[,working_values:=sum(original_values), by=some_grouping_information]

  })

  output$tableOut<- renderTable(rv_dtWeights())

}
shinyApp(ui = ui, server=server)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 2016-02-13
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    相关资源
    最近更新 更多