R Shiny:使用reactiveValues()和data.table按引用分配

时间:2017-05-19 16:13:26

标签: r shiny data.table

我有一个闪亮的应用程序,其中多个反应组件使用计算速度慢的函数的相同结果。为避免多次计算慢速函数,我可以使用set(MKL_INCLUDE_DIRS ${MKL_ROOT_DIR}/include) if(NOT EXISTS "${MKL_INCLUDE_DIRS}/mkl_version.h") # added these 3 lines mkl_fail() # endif() # get_mkl_version(${MKL_INCLUDE_DIRS}/mkl_version.h) 在输入更改时重新计算函数,并使结果可用于需要它的所有反应组件。

但是,如果reactiveValues()对象是reactiveValues,并且我使用data.table更新它,则shine不会检测到更改,并且依赖它的输出不会更新

有没有办法使用data.table通过引用分配:=或其他避免多次重新计算函数的方法。

以下是使用data.table assign-by-reference的可重现示例,其中reactiveValues在输入更改时无法更新:

output$result2

为了进行比较,这里是使用data.frames标准分配的服务器函数的一个版本,它按预期执行:

library(shiny)
library(data.table)
library(plotly)

ui = fluidPage(
  sidebarLayout(
    sidebarPanel(
      sliderInput('x1', 'x1', min=0, max=2, value=1, step=0.1)
    ),
    mainPanel(
      plotlyOutput('result1'),
      verbatimTextOutput('result2')
    )
  )
)

server = function(input, output) {
  values <- reactiveValues()
  values$dt = data.table(v1 = 1:100, v2 = 1)

  slow.func = function(my.dt, x) {
    Sys.sleep(2)
    my.dt[, v2 := v1^x]
  }

  output$result1 = renderPlotly({
    values$dt = slow.func(values$dt, input$x1)
    plot_ly(values$dt) %>%
      add_lines(x = ~v1, y = ~v2)
  })      
  output$result2 = renderText({
    paste('Final value =', values$dt[.N, v2])
  })  
}
shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:1)

假设您已定义了一个反应变量table_updated,因此每次执行慢速功能时都可以将其增加一。其他值/图只需要观察table_updated

实际上actionButton(see description section)执行相同的操作,每次单击它时,其值都会增加1.

values <- reactiveValues(table_updated = 0)

slow.func = function(my.dt, x) {
  # do stuff
  values$table_updated <- values$table_updated + 1
}

output$result2 = renderText({
  values$table_updated
  paste('Final value =', values$dt[100,]$v2)
})