相关疑难解决方法(0)

异步进程阻止R Shiny app

应该可以使用R包futurepromises通过Shiny应用程序触发异步(长时间运行)处理,而不会冻结应用程序的其余部分,而异步进程在另一个R进程中运行.

看到:

https://cran.r-project.org/web/packages/promises/vignettes/intro.html
https://cran.r-project.org/web/packages/promises/vignettes/overview.html
https://cran.r-project.org/web/packages/promises/vignettes/futures.html
https://cran.r-project.org/web/packages/promises/vignettes/shiny.html
Run Code Online (Sandbox Code Playgroud)

我让它在基于R脚本的环境中工作,但是当我实现一个带有2个函数的简单闪亮应用程序时,无法使其工作.在异步功能运行时,"非异步"功能始终被阻止,但情况并非如此.

我在包的GitHub回购中发布了相同的问题promises:https://github.com/rstudio/promises/issues/23

我在这里发帖也希望有人可以提供帮助.

问题是:

  1. 你能看看下面发布的闪亮的应用程序示例,让我知道为什么异步处理阻止了应用程序?(它不应该阻止).
  2. 理想情况下,您是否可以提供具有非阻塞异步和正常功能的应用程序的小示例(在异步运行时可访问)?

环境

Mac OS 10.12

$ R --version
R version 3.4.3 (2017-11-30) -- "Kite-Eating Tree"

remove.packages("future")
remove.packages("promises")
remove.packages("shiny")

install.packages("future")
install.packages("devtools")
devtools::install_github("rstudio/promises")
devtools::install_github("rstudio/shiny")

> packageVersion("future")
[1] ‘1.8.1’
> packageVersion("promises")
[1] ‘1.0.1’
> packageVersion("shiny")
[1] ‘1.0.5.9000’
Run Code Online (Sandbox Code Playgroud)

关于闪亮软件包版本的一个问题,https://rstudio.github.io/promises/articles/intro.html说它应该> = 1.1,但即使使用devtools安装,版本仍然是1.0.5 .... 这是一个问题还是文档中有拼写错误?

首先,你可以使用带有闪亮输出的promises.如果您使用的是异步兼容版本的Shiny(版本> = 1.1),则所有内置的renderXXX函数都可以处理常规值或承诺.

问题的例子

我已经实现了这个简单的闪亮应用程序,灵感来自上面提到的URL的示例.闪亮的应用程序有2个"部分":

  1. 用于触发"长时间运行"异步处理的按钮.这是通过一个read_csv_async休眠几秒钟的函数模拟的,将csv文件读入数据帧.然后在按钮下方呈现df.
  2. 一个应该在任何时候工作的简单功能(包括触发异步处理时):它包含一个滑块,用于定义要生成的多个随机值.然后我们渲染这些值的直方图.

问题是在执行异步处理时会阻止第二个功能(直方图更新).

global.R

library("shiny")
library("promises")
library("dplyr")
library("future")

# path containing all …
Run Code Online (Sandbox Code Playgroud)

asynchronous r shiny

12
推荐指数
1
解决办法
696
查看次数

如何在R Shiny中使操作不间断

在我闪亮的应用程序中,我有一个输出,该输出应不断更新。但是,每当我执行长时间运行的计算时,输出就会暂停。我的问题是:如何使输出连续不断地运行?

请查看下面的简短演示:时钟每隔一秒刷新一次,但是如果我单击运行5秒钟的按钮,时钟将暂停。

library(shiny)

ui <- fluidPage(
    actionButton("button","Expensive calcualtion(takes 5 seconds)"),
    tags$p("Current Time:"),
    textOutput("time"),
    tags$p("Result from clicking button:"),
    textOutput("result")
)

server <- function(input, output, session) {
    output$time <- renderText({
        invalidateLater(1000)
        as.character(Sys.time())
    })

    observeEvent(input$button,{
        Sys.sleep(5)
        output$result <- renderText(runif(1))
  })
}

shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)

我试图使用futurepromises让长时间运行的进程异步运行,但是它不起作用。哪里错了?有没有更好的方法可以达到这个目的?

library(shiny)
library(future)
library(promises)
plan("multisession")

ui <- fluidPage(
    actionButton("button","Expensive calcualtion(takes 5 seconds)"),
    tags$p("Current Time:"),
    textOutput("time"),
    tags$p("Result from clicking button:"),
    textOutput("result")
)

server <- function(input, output, session) {
    output$time <- renderText({
        invalidateLater(1000)
        as.character(Sys.time())
    })

    process <- eventReactive(input$button,{ …
Run Code Online (Sandbox Code Playgroud)

r shiny

8
推荐指数
1
解决办法
125
查看次数

标签 统计

r ×2

shiny ×2

asynchronous ×1