如何在启动时将 Rmetric 财务日历全局加载到 golem 中?

How do I globally load Rmetric Financial calendars into `golem` at the startup?

问题:

使用 load_rmetrics_calenders() 设置“全球”财务日历的最佳做法是什么? 即 golem 中函数的单数 运行?

背景:

这个问题是在找到可能的解决方案之前提出的。我正在使用我制作的函数,该函数使用 {bizdays} 包来确定某些财务日期。我需要使用函数 load_rmetrics_calenders() 来 initiate/set 日历,以便在 bizdayz::adjust.previous(..., cal = "Rmetrics/NYSE) 中进行后续调用。我知道我也可以使用全局设置来设置压延机,但这在过去给我带来了问题。

我希望在 golem 实例的开头执行一次 to 运行 load_rmetrics_calenders() -- 而不是必须直接在函数中调用该函数,这会减慢它的速度。

代表:

my_function<- function(stock = NULL, from = NULL, to = NULL, ...){
    # Set Biz Calender 
 
    # bizdays::load_rmetrics_calendars(year = c(1950:2030), financial = TRUE)

    # DEFENSIVES ---------------------------------------------------------------------------------------------------
    # Assign `to` --> yesterdays close, will reset when close data comes in, 12am
    to <- bizdays::adjust.previous(Sys.Date() - 1, cal = "Rmetrics/NYSE")

我想在每次调用此函数时忽略设置日历,或者在 运行 在线时在 golemApp 实例中调用它。

可能的答案:

#1: 当前实施

# Just running the function within the `runApp()`

run_app <- function(
  onStart = NULL,
  options = list(),
  enableBookmarking = NULL,
  ...
) {

  #Configure financial calender
  golem::cat_dev("Loading NYSE calender from Quantlib \n")
  bizdays::load_quantlib_calendars(ql_calendars = "UnitedStates/NYSE", from = "1950-01-01", to = "2030-01-01")
  golem::cat_dev("Done loading calender. \n")

  # Configure global polished settings
  polished_config()

  reactlog::reactlog_enable()

  with_golem_options(
    app = brochureApp(
      # Putting the resources here
      golem_add_external_resources(),
      # Add pages
      welcomePage(),
      # login(),
      dashboard(),
      # logout(),
      terms(),
      onStart = onStart,
      options = options,
      enableBookmarking = enableBookmarking,
      wrapped = shiny::tagList
    ),
    golem_opts = list(...)
  )
}

#2: 在脚本中将其写入 运行 而不是调用 runApp() 即从 Docker

# .R file to be called instead of running run_app() explicitly 

  #Configure financial calender
  golem::cat_dev("Loading NYSE calender from Quantlib \n")
  bizdays::load_quantlib_calendars(ql_calendars = "UnitedStates/NYSE", from = "1950-01-01", to = "2030-01-01")
  golem::cat_dev("Done loading calender. \n")

  # Configure global polished settings
  polished_config(...)

  reactlog::reactlog_enable()

# Run app with the calendar loaded
run_app()

您可以在 run_app() 函数启动之前 运行 函数,并将结果作为参数传递给 run_app() 函数。

例如:https://github.com/inrae/diades.atlas/blob/main/app.R#L30,在这里,我构建了一系列元素并将它们传递给 run_app(),所以它 运行 不那么频繁(在这里,每次新应用程序在 RStudio Connect 中启动。

如果您希望在每个闪亮的会话中启动该功能,您也可以在服务器顶部进行设置(但我想这不是您想要的)。

因此,这取决于您的部署逻辑:

  • 如果你正在部署一个容器,你可以使用(这里是伪代码):CMD R -e "myapp::run_app(data = mypak:build_stuff())"。请注意,这将取决于您使用的容器管理服务。例如 Shiny Proxy 会 运行 每个用户一个容器,所以每次有新用户来时都会调用 build_stuff()

  • 如果您使用的是 RStudio 产品,则可以使用链接的 GitHub 代码中的 run_app() 方法。

如果您需要探索 {golem} 应用程序的行为以及什么时候发生 运行,我这里有一个玩具示例 https://github.com/ColinFay/golemexamples/tree/master/golemloadorder 可以让您知道什么时候发生run/loaded.

干杯, 科林