1

I am experimenting with Shiny and async programming in the hopes of using it in a larger, more complex, public application.

In this example, I thought that unlist() would wait until the value of v1 is returned because of the use of future_promise and the promise pipe, %...>%.

However, I get the error:

Error in unlist: object 'v1' not found

How can I get this demo code to work?

app.R

library("zeallot")
library("shiny")
library("primes")
library("future")
library("promises")
library("tidyverse")

plan(multisession)

source("/home/law/whatbank_multicore_test/src/expensive_calc.R")

ui <- fluidPage(
  actionButton("do", "Do Expensive Calc"),
  textOutput("text")
)

server <- function(input, output, session) {
  observeEvent(input$do, {
      output$text <- renderText({
        future_promise(zeallot::`%<-%`(c(v1, v2), expensive_calc()), seed = TRUE) %...>% 
          {
            tmp <- unlist(v1)
          }
      })
  })
}

shinyApp(ui, server)

expensive_calc.R

expensive_calc <- function(){
  
  min <- 10000
  max_num <- sample(80000:210000, 1)
  rap <- ruth_aaron_pairs(min, max_num, distinct = FALSE)
  
  list(rap, 11)
}
ixodid
  • 2,180
  • 1
  • 19
  • 46

1 Answers1

0

As pointed out to me in the RStudio Community the zeallot call needs to be within the future_promise braces. Here is the solution:

server <- function(input, output, session) {
  observeEvent(input$do, {
      output$text <- renderText({
        future_promise(seed = TRUE) %...>% 
          {
            zeallot::`%<-%`(c(v1, v2), expensive_calc())
            tmp <- unlist(v1)
          }
      })
  })
}
ixodid
  • 2,180
  • 1
  • 19
  • 46