我的闪亮应用显示了 10 个不同的光伏系统。对于每个光伏系统,该应用程序执行完全相同的计算。我使用闪亮的模块来减少行数。过程如下:
目前代码被执行,加载API数据的等待时间很长。我想通过使用 future 包来减少最终用户的等待时间。
目前我不明白如何将 future() 实现到我闪亮的模块中。
例如:
API api <- function(id,df, api_siteid, api_key, startmonth, startdate, url,db_location){ 一些代码 }
api(
id = "bb55",
df = read.csv("Anlagen/Barbarastrasse_55-1/bb55.csv"),
api_siteid = "8784240",
api_key = "EY0HXOAH1Y6fgMY912RGGPUGJD5C2G",
startmonth = "apr2029",
startdate <- "20200401",
url = "https://monitoringapi.solaredge.com/site/",
db_location = "Anlagen/barbstreet_55-1/bb55.csv"
)
bb55_act <- read.csv("Anlagen/Barbarastrasse_55-1/bb55.csv")
模块服务器
ib_prod_month_pkWp_UI <- function(id){
valueBoxOutput(NS(id,"ib_prod_pkwp_month"))
}
ib_prod_month_pkWp_server <- function(id,df, kwp_size){
moduleServer(id, function(input, output, session){
output$ib_prod_pkwp_month <- renderInfoBox({
result <- df %>%
mutate(timestamp = as.POSIXct(timestamp, format = "%Y-%m-%d %H:%M:%S")) %>%
filter(year(timestamp) == year(Sys.Date()) &
month(timestamp) == month(Sys.Date())) %>%
summarise(kwh = sum(prod) / as.numeric(kwp_size))
valueBox(
subtitle = "Prod. diesen Monat p. kWp",
prettyNum(
result$kwh,
big.mark = ".",
decimal.mark = "," ,
digits = 4,
scientific = FALSE
)
)
})
})
}
ib_prod_today_pkWp_server("bb55_1_ib_prod_pkwp_today", df = bb55_act, kwp_size = bb55_size)
api() 的结果是将新数据写入一个csv文件。之后,csv 文件被加载到 bb55_act = df 中。
对每个光伏系统重复此过程。我想并行化 API 调用,因为这是代码的主要耗时部分。
感谢您的帮助!
答案 0 :(得分:0)
据我所知,如果多个用户同时使用该应用程序,{future}
的使用只会影响性能。由于您将 API 响应保存在本地文件系统中,我建议您使用 callr::r_bg()
在后台作业中运行 API 请求并使用 shiny::reactiveFileReader()
获取响应。
看下面的例子,我做了一些简化
api_args <- list(
list(id = "first_resource", destfile = "~/api_files/destfile1.csv"),
list(id = "second_resource", destfile = "~/api_files/destfile2.csv")
)
make_api_calls <- function() {
lapply(api_args, function(x) {
callr::r_bg(api, x)
})
}
mod_valuebox_server <- function(id) {
moduleServer(id, function(input, output, session) {
df <- reactiveFileReader(api_args[[1]]$destfile)
result <- df %>%
summarise(kwh = sum(prod) / as.numeric(kwp_size))
output$balueBox <- valueBox(result$kwh)
})
}
简化