解决渲染htmlwidgets中的承诺

时间:2018-03-21 12:55:03

标签: r promise shiny future htmlwidgets

我想知道是否有人可以帮助htmlwidgets和相关的渲染函数如何在promises中使用promises(即futureshiny包)。

我一直在阅读并学习如何根据Joe Chengs的文章和rstudioconf talk来整合这些东西。 E.g

https://medium.com/@joe.cheng/async-programming-in-r-and-shiny-ebe8c5010790 https://medium.com/@joe.cheng/an-informal-intro-to-async-shiny-cbf01c85c4c5

https://www.rstudio.com/resources/videos/scaling-shiny-apps-with-async-programming/(顺便说一句好话)

关于DT的promises软件包的github repo上引发了一个问题,但据说大多数htmlwidget软件包都不需要修改。

https://github.com/rstudio/promises/issues/10

我已经尝试过很多东西来让htmlwidgets从promises中呈现出来但却无法使用闪亮的工具。例如,对于dygraphsleaflet,以下在闪亮之外工作(标准plot()也包含在内作为参考)

library(promises)
library(future)
plan(multiprocess)
library(shiny)
library(leaflet)
library(dygraphs)

expensive_operation = function(){
  Sys.sleep(2)
  data.frame(x=runif(10))
}

future({ expensive_operation() }) %...>% plot
future({ expensive_operation() }) %...>%
{leaflet(.) %>% addTiles() %>% addMarkers(~x,~x) %>% print}
future({ expensive_operation()}) %...>% {
  dygraph(.) %>% print
}

到目前为止一切都很好。

我已经从github安装了shiny的开发版本。但是在下面:

ui = fluidPage(
  leafletOutput("l"),
  plotOutput("p"),
  dygraphOutput("d")
)

server = function(input, output, session) {
  output$p = renderPlot({
    future({ expensive_operation() }) %...>% plot
  })
  output$l <- renderLeaflet({
    ## neither 
    # future({ expensive_operation() }) %...>%
    # {leaflet(.) %>% addTiles() %>% addMarkers(~x,~x) %>% print} # prints in rstudio viewer
    # nor
    future({ expensive_operation() }) %...>%
    {leaflet(.) %>% addTiles()%>% addMarkers(~x,~x)} # does nothing
    # work
  })

  #similar story to leaflet
  output$d = renderDygraph({
    # future({ expensive_operation()}) %...>% {
    #   dygraph(.) %>% print
    # }
    future({ expensive_operation()}) %...>% {
      dygraph(.)
    }

  })
}

runApp(shinyApp(ui,server))

只有标准图实际渲染。调用print或其他版本的注释版本都不会在闪亮的应用内部执行任何操作。包括print允许将其打印到rstudio查看器,但这不符合目的。

有没有人对我误解或出错的地方有任何建议?

0 个答案:

没有答案