我想找到一种方法来在闪亮的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; ...
我想我正在寻找一些东西;)
答案 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))
})