闪亮:让用户输入未来的功能

Shiny: Getting a user input into a future function

我正在构建一个闪亮的应用程序,用户可以在其中上传一堆数据,然后选择应该计算的数据。计算本身相当耗时,应存储在列表中。为了在计算过程中保持闪亮的响应(对于用户和其他用户),我尝试使用 promisesfuture。问题是我无法输入 future 函数。我总是得到 Warning: Error in $: Can't access reactive value 'mem_pos' outside of reactive consumer. i Do you need to wrap inside reactive() or observe()? [No stack trace available]。我试图阅读有关 reactive 的内容,但我只是卡住了。

这是问题的一个最小示例(为了显示它,每个列表只有一个值):

library(shiny)
library(promises)
library(future)

plan(multisession)

# example function
subfct = function(n) {
  Sys.sleep(3)
  return(n*2)
}

# shiny page
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      numericInput("mem_pos", min = 1, max = 30, value = 1, label="mem pos"),
      actionButton("mem_button", label="set mem value")
    ),
    mainPanel(
      tableOutput("result")
    )
  )
)

server <- function(input, output) {
  superval = reactiveValues(mem = rep(list(0), 10))
  
  # set the future calculations
  observeEvent(input$mem_button, {future({return(subfct( input$mem_pos ))}) %...>% {superval$mem[[input$mem_pos]] = .}}) # here lies the problem

  # show result table
  observe( {output$result = renderTable({unlist(superval$mem)})})
}

# Run the application 
shinyApp(ui = ui, server = server)

如果有问题的线路被 observeEvent(input$mem_button, {future({return(subfct( 5 ))}) %...>% {superval$mem[[input$mem_pos]] = .}}) 交换,它基本上可以工作。但是我无法让用户输入该功能。我很感激 reactive 对我的具体问题的直接帮助或解释。

您可以尝试使用 shinyjs 包中的 delay() 函数。这使代码仅在设置的时间过去后才变为 运行。例如

图书馆(闪亮) 图书馆(闪亮的) ui<-fluidPage(useShinyjs, ...) 服务器<-函数(输入、输出、会话){ 延迟(毫秒=, ...) } shinyApp(ui,服务器)

我解决了。不完全确定为什么,但 isolate 可以解决问题。 此代码对我有用:

library(shiny)
library(promises)
library(future)

plan(multisession)

# example function
subfct = function(n) {
  Sys.sleep(3)
  return(n*2)
}

# shiny page
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      numericInput("mem_pos", min = 1, max = 30, value = 1, label="mem pos"),
      actionButton("mem_button", label="set mem value")
    ),
    mainPanel(
      tableOutput("result")
    )
  )
)

server <- function(input, output) {
  superval = reactiveValues(mem = rep(list(0), 10))
  
  # set the future calculations
  observeEvent(input$mem_button, {future({return(subfct( isolate(input$mem_pos)  ))}) %...>% {superval$mem[[input$mem_pos]] = .}}) # here lied the problem 
  
  # show result table
  observe( {output$result = renderTable({unlist(superval$mem)})})
}

# Run the application 
shinyApp(ui = ui, server = server)