0

我闪亮的应用程序显示了 10 种不同的光伏系统。对于每个光伏系统,该应用程序都会进行完全相同的计算。我使用闪亮的模块来减少行数。过程如下:

  1. 数据从 API(模块)加载
  2. 重新计算来自 api 的数据(模块)
  3. 使用信息框、ggplot 等对数据进行图形处理。

目前代码被执行,加载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 调用,因为这是代码中主要耗时的部分。

谢谢你的帮助!

4

1 回答 1

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)
  })
}

简化

  • 我假设 API 函数有一个参数定义要抓取的资源和一个参数用于下载位置
  • 处理发生在“valuebox-module”中
  • “valuebox-module”仅呈现第一个 API 响应的结果
于 2021-08-01T14:51:48.730 回答