我想知道是否可以使用其中一个并行处理后端(可能不是)R.我尝试了一些谷歌搜索,没有任何结果.
我目前遇到的一般问题:
load理想情况下,我可以从交互式会话中调度命令,而不必等待它返回(所以我可以在等待渲染时继续做其他事情).这是可能的,还是这是一厢情愿的想法?
如果我问一个非常基本的问题,我会提前道歉.我是R和Shiny的新手,我无法在任何地方找到解决这个问题的方法.
在这里,我有一个非常基本的shinyApp,在ui.R中有两个按钮,Start按钮将调用一个循环运行的函数,并在屏幕上显示一些东西.我有一个停止按钮,应该能够终止此循环.
我无法获得终止无限循环的停止按钮,任何想法?
以下是我试过的.如果我做错了,请原谅我
#ui.R
library(shiny)
shinyUI(fluidPage(
actionButton("startSearch", label = "Start Search"),
actionButton("stopSearch", label = "Stop Search")
))
#server.R
library(shiny)
shinyServer(function(input, output, session){
initial.stop <- 0
observeEvent(input$startSearch,
{
while(TRUE)
{
Sys.sleep(1)
if (initial.stop < input$stopSearch)
{
print('break')
stop('error')
}
print("Infinite loop")
}
})
})
Run Code Online (Sandbox Code Playgroud)
这是一个问题,因为R是单线程的,而应用程序没有响应,因为它陷入无限循环.实际上,我们在for循环中运行了大量耗时的计算,我们需要在用户单击停止时在当前迭代之后停止计算.
有没有办法解决这个问题?任何建议都会有所帮助.谢谢
这个问题是这个问题的连续性:是否有可能停止执行shiny内部的R代码(而不停止shiny进程)?。
我在应用程序中显示的绘图需要一些时间才能生成,我希望用户能够停止其创建(例如,如果他们在选项中犯了错误)。我发现这篇关于在 Shiny 中使用的博客文章callr。工作流程如下:
invalidateLater()每一秒都检查后台进程是否完成。如果是,那么我将显示该图。首先,我不确定当几个人同时使用该应用程序时,这会如何扩展。由于每个后台进程都是独立的,因此我认为一个用户不会阻止其他进程,但我可能是错的。
其次,我想在绘图上显示一个等待指示器。到目前为止,我使用该包waiter来做到这一点,但这里的问题是renderPlot()每秒都会失效以检查后台进程是否完成。因此,waiter当输出无效时, 会反复出现和消失。
下面是一个示例应用程序,它模仿了我想要的行为:
library(shiny)
library(uuid)
library(ggplot2)
library(waiter)
ui <- fluidPage(
useWaiter(),
titlePanel("Test background job"),
actionButton("start","Start Job"),
actionButton("stop", "Stop job"),
plotOutput("plot")
)
# the toy example job
slow_func <- function(var){
library(ggplot2)
Sys.sleep(5)
ggplot(mtcars, aes(drat, !!sym(var))) +
geom_point()
}
server <- function(input, output, session) {
w <- Waiter$new(id = "plot")
token <- reactiveValues(var = NULL, id = NULL, last_id = …Run Code Online (Sandbox Code Playgroud)