如何将闪亮的进度条与llply进度条

时间:2016-09-09 22:29:52

标签: r shiny plyr

我想找到一种方法来在闪亮的UI中显示一个llply进度条。 请看下面的代码。你有什么想法吗?

library(shiny)
library(plyr)
function_I_cant_edit <- function(){plyr::llply(LETTERS ,.fun=function(x){Sys.sleep(0.2)},.progress = "text")}

server<-shinyServer(function(input, output,session) {


  observeEvent(input$go, {

    progress <- shiny::Progress$new(session, min=1, max=15)
    on.exit(progress$close())
    progress$set(message = 'Calculation in progress')
    function_I_cant_edit()

    for (i in 1:15) {
      progress$set(value = i)
      Sys.sleep(0.1)
    }

  })

  output$plot <- renderPlot({
    plot(cars)
  })
})

ui <- basicPage(
  actionButton("go","PUSH ME"),
  plotOutput("plot")

)
shinyApp(ui = ui, server = server)

一个想法是使用progress =&#34; tk&#34;在llply里面,但有最性感的方式吗?

另一个想法是在闪亮的应用程序中显示控制台输出......但我没有管理它。

此致

编辑:

llpy函数使用progress_tk()或progress_text()或progress_time()

所以我创建了一个progress_shiny()函数

    progress_shiny <-function (title = "plyr progress", label = "Working...", ...) 
{
  n <- 0
  tk <- NULL
  list(init = function(x) {
    tk    <<- shiny::Progress$new(session,min=1, max=15)

    tk$set(message = 'Calculation in progress')
  }, step = function() {
    n <<- n + 1
    tk$set(value = n)
  }, term = function() print("fin"))
}

我试过了:

server<-shinyServer(function(input, output,session) {

  # session <<- session
  observeEvent(input$go, {


    # function_I_cant_edit()
    llply(LETTERS ,.fun=function(x){Sys.sleep(0.2)},.progress = "shiny")


  })

  output$plot <- renderPlot({
    plot(cars)
  })
})

ui <- basicPage(
  actionButton("go","PUSH ME"),
  plotOutput("plot")

)
shinyApp(ui = ui, server = server)

但是错误信息是“public_bind_env $ initialize(...)中的错误:objet&#39; session&#39; introuvable&#39; ...

我想我正在寻找一些东西;)

2 个答案:

答案 0 :(得分:2)

您可以创建一个自定义进度处理程序,该处理程序将progress对象从闪亮中取出,例如

progress_shiny <-function (progress, step = 1){
  list(
    init = function(n){},
    step = function() {
      progress$set( progress$getValue() + step )
    }, 
    term = function(){}
  )
}

在服务器代码中使用类似的东西。

observeEvent(input$go, {
  progress <- shiny::Progress$new(session, min=0, max=50)
  on.exit(progress$close())

  # use the main progress outside of llply 
  progress$set( value = 1)
  Sys.sleep( 1 )
  progress$set( value = 20 )

  # then pass it along so that llply steps 
  # contribute to the main progress
  llply(LETTERS ,.fun=function(x){
    Sys.sleep(0.2)
  }, .progress = progress_shiny(progress))

})

这样llply内的进度条就会影响主进度条

答案 1 :(得分:0)

code from the plyr package之后,您还可以将进度对话框的初始化和终止也放入函数中。加上一些合理的默认值,就可以进行相当干净的呼叫。

progress_shiny <- function(session, min=0, value=min, step=1, message="Working...") {
  p<-NULL
  list(
    init = function(max) {
      p<<-shiny::Progress$new(session, min=min, max=max)
      p$set(value=value, message=message)
    },
    step = function() {
      p$inc(step)
    },
    term = function(){
      p$close()  
    }
  )
}

用法变得更短:

observeEvent(input$go, {
  # no additional setup needed
  llply(LETTERS ,.fun=function(x){
    Sys.sleep(0.2)
  }, .progress = progress_shiny(session))
})