作者clsmbstu (missing)
看板R_Language
标题[问题] Shiny可以在运算未完成时於UI提示吗?
时间Mon Aug 21 22:43:00 2017
[问题类型]:
程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
[软体熟悉度]:
使用者(已经有用R 做过不少作品)
[问题叙述]:
我最近做了一只Shiny程式,但它需要的运算耗时比较久,
(而且在shinyapps.io上花的时间比我在本地长很多...)
好奇有没有可能在UI里面加一行提示(例如「运算中,请稍候」之类的),
而且只在结果还没出来时才有那一行?
我知道也许长期目标是让我的程式码更有效率一点,
但目前我还想不到改写的方式。 orz
[程式范例]:
ui <- fluidPage(
# Other UI elements
conditionalPanel(condition = "output.done == 'FALSE'",
helpText("运算中,请稍候"))
)
server <- function(input, output) {
output$done <- reactive({"FALSE"})
# Complicated processes
output$done <- reactive({"TRUE"})
outputOptions(output, "done", suspendWhenHidden = FALSE)
}
[关键字]:
shiny, dynamic UI
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.167.58.15
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1503326582.A.2EC.html
1F:→ celestialgod: 关键字 showModal shiny 08/22 00:28
2F:→ celestialgod: 或是勇shinyBS,不过个人不推 08/22 00:29
3F:→ celestialgod: shinyBS::bsModal 一年前用有一些问题,不确定现在 08/22 00:31
4F:→ celestialgod: 有没有改善,但是多数功能 shiny showModal就可以解 08/22 00:31
5F:→ celestialgod: 决 08/22 00:31
6F:→ clsmbstu: 感谢!再找时间来玩玩看~ 08/22 01:51
8F:→ clsmbstu: 这个也好棒!大感谢! 08/22 10:37
※ 编辑: clsmbstu (140.112.25.106), 08/22/2017 11:13:43
9F:→ clsmbstu: 细读之後发现我的状况withProgress提供的帮助有限 08/22 15:35
10F:→ clsmbstu: 因为我最花时间的地方是leaflet::addPolygons而非回圈 08/22 15:35
11F:→ clsmbstu: 我试过把地图绘制的pipeline切开来并在中间放incProgess 08/22 15:37
12F:→ clsmbstu: 但诡异的是进度条跑满了,图还是要再等一阵子才会出来 08/22 15:38
13F:推 cywhale: 不是可以 withProgress(message=... { 08/23 01:05
14F:→ cywhale: ..(Your processes)..leaflet %<>% addPolygons() }) 08/23 01:06
我是参考你附的连结的写法,
(本来想把每个server outputs都包在一个withProgress一起读进度,但逻辑好像不对)
以下是我的server function一部分的简化(省去根据UI的一些条件判断式):
output$mapplot <- renderLeaflet({
# Define palettes
pal <- colorNumeric("YlOrRd", merge_map()$Values)
labs <- sprintf(
"<strong>%s</strong><br>%g%%", merge_map()$CountyTown, merge_map()$Values
) %>%
lapply(HTML)
# Map plotting
leaflet(merge_map()) %>%
setView(121, 23.5, 7) %>%
addTiles() %>%
addPolygons(weight = 2, color = "white", dashArray = 3,
fillColor = ~pal(Values), fillOpacity = 0.8,
highlightOptions = highlightOptions(
weight = 5, color = "#636363", bringToFront = TRUE
),
label = labs,
labelOptions = labelOptions(
textsize = "15px",
style = list("font-weight" = "normal")
)) %>%
addLegend(position = "bottomright",
pal = pal, values = ~Values, opacity = 0.8,
title = "Percentages",
labFormat = labelFormat(suffix = "%"))
})
为了加进度条,变成:
output$mapplot <- renderLeaflet({
withProgress(
value = 0, message = "地图绘制中", detail = "制作说明标签"
expr = {
# Define palettes
pal <- colorNumeric("YlOrRd", merge_map()$Values)
labs <- sprintf(
"<strong>%s</strong><br>%g%%", merge_map()$CountyTown, merge_map()$Values
) %>%
lapply(HTML)
incProgress(0.1, detail = "套叠地图图层")
# Map plotting
final_map <- leaflet(merge_map()) %>%
setView(121, 23.5, 7) %>%
addTiles()
incProgress(0.2, detail = "绘制各区域资料")
final_map <- addPolygons(
final_map, weight = 2, color = "white",
dashArray = 3,
fillColor = ~pal(Values), fillOpacity = 0.8,
highlightOptions = highlightOptions(
weight = 5, color = "#636363", bringToFront = TRUE
),
label = labs,
labelOptions = labelOptions(
textsize = "15px",
style = list("font-weight" = "normal")
))
incProgress(0.5, detail = "制作图例")
final_map <- addLegend(
final_map, position = "bottomright",
pal = pal, values = ~Values, opacity = 0.8,
title = "Percentages",
labFormat = labelFormat(suffix = "%"))
incProgress(0.2, detail = "即将完成")
}
)
final_map
})
先不提每次的进度前进多少其实是我的主观认定这件事,
要把原本的pipeline切开才能更新进度条也是有点麻烦。
最後更奇怪的是,进度条还是几乎瞬间跑完,但地图并没有马上出来...
我怀疑要把物件呈现上来本身也很花时间?
但是在这里的倒数第二行"final_map"似乎不能包进withProgress里面,
否则根本不会有地图出来。
这样提供的资讯够吗?
※ 编辑: clsmbstu (140.112.121.113), 08/23/2017 17:00:25
15F:推 cywhale: 跑比较多polygon在leaflet 最後这一步的确会慢一些.. 08/23 22:04
16F:→ cywhale: 不过如果用leafletProxy放不需要更新的部分,只更新新的 08/23 22:08
17F:→ cywhale: addpolygon部分 不知道对最後这一步显示速度有无帮助.. 08/23 22:09
18F:→ clsmbstu: 感谢!我也有查到leafletProxy,但我是主观猜测应该帮助 08/23 22:30
19F:→ clsmbstu: 不大,毕竟我每次更换输入就是要重画超过350个polygons 08/23 22:31
20F:→ clsmbstu: 而前面只是做到addTiles而已 QQ 08/23 22:32
21F:推 locka: 请问clsmbstu大大是在一个addPolygons()里超过350个多边形( 08/23 23:14
22F:→ locka: 例如全台乡镇)还是addPolygons()执行350次啊?? 08/23 23:14
23F:→ clsmbstu: 是前者喔 我就是在画全台乡镇 XD 08/23 23:40