R语言 当输入是Shiny中值的列表时,如何从缓存中提取计算值

lb3vh1jj  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(83)

我正在创建一个应用程序,其中使用了机器学习算法,而后者需要大量的计算能力。我想使用函数bindCache来提取计算结果。但是,当我的输入以不同的方式排序,但结果保持不变时,我的算法会重新计算所有内容,这是我不希望的。下面是一个简单的示例来说明我的问题:

library(shiny)

shinyApp(
  ui = fluidPage(
    selectInput("x", "x", seq(10), multiple = TRUE)
    , br()
    , br()
    , br()
    , br()
    , br()
    , br()
    , br()
    , br()
    , br()
    , br()
    , verbatimTextOutput("txt")
  ),
  server = function(input, output){
    r <- reactive({
      message("Doing expensive computation...")
      Sys.sleep(2)
      sort(as.numeric(input$x))
    }) %>% bindCache(input$x)
    
    output$txt <- renderText(r())
  }
  
)

例如,如果输入2,然后输入5,则输入为c(2,5),总和为7。如果再次输入2,然后输入5,则结果将被保存。但是,如果再次输入5,然后输入2,则结果将再次重新计算,以获得相同的结果。如果值列表包含相同的值但没有排序,如何避免重新计算?

vaqhlq81

vaqhlq811#

我相信这是可行的:

bindCache(sum(as.numeric(input$x)))
vtwuwzda

vtwuwzda2#

您可以尝试memoise而不是bindCache

library(memoise)

some_func = function(sorted_input) { 
  Sys.sleep(2)
  return(sorted_input) 
}

some_func_memoised = memoise(sort_inputs)

input = c(1,3,5,2,4)

system.time(some_func(sort(input)))

user  system elapsed 
0.007   0.004   2.002

system.time(some_func_memoised(sort(input)))

user  system elapsed 
0.009   0.004   2.005 

# Same elements in a different order
input = c(5,3,1,4,2)

system.time(some_func(sort(input)))

0.008   0.005   2.001 

system.time(some_func_memoised(sort(input)))

user  system elapsed 
0.001   0.000   0.000

相关问题