如何限制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
相关产品推荐
相关产品推荐

