You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制qlcal包中setCalendar()的作用域至函数内部?

如何限制qlcal包中setCalendar()的作用域至函数内部

要避免setCalendar()修改全局日历状态,核心思路是在函数执行前保存当前全局日历,注册函数退出时的恢复操作,确保不管函数正常完成还是中途出错,都能把全局日历还原到初始状态。

修改后的函数代码如下:

library(qlcal)

getName() # 返回当前全局日历名称
#> [1] "TARGET"

isHoliday(as.Date("2024-05-01"))
#> [1] TRUE

isHolidayInCal <- function(date, calendar){
  # 保存当前全局日历
  current_calendar <- getName()
  # 注册退出时的恢复操作,确保函数结束后还原全局日历
  on.exit(setCalendar(current_calendar))
  
  message("in func before setCalendar: ", getName())
  setCalendar(calendar)
  message("in func after setCalendar: ", getName())
  return(isHoliday(date))
}

isHolidayInCal(as.Date("2024-05-01"), "UnitedStates/NYSE")
#> in func before setCalendar: TARGET
#> in func after setCalendar: New York stock exchange
#> [1] FALSE

getName() # 现在全局日历回到了初始状态
#> [1] "TARGET"

关键说明

  • current_calendar <- getName():在修改日历前,先把当前全局日历的名称存起来
  • on.exit(setCalendar(current_calendar)):on.exit()会在函数退出时自动执行括号内的代码,不管函数是正常返回还是抛出错误,都能保证全局日历被还原,彻底隔离函数内的日历修改对全局的影响

内容的提问来源于stack exchange,提问作者mac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:09:51