R语言自定义函数嵌套glue函数时参数传递失败问题求助
自定义日志函数变量无法识别的问题解决
问题原因
你遇到的错误是因为glue::glue的环境解析逻辑导致的:
当你在test_fc中传递"{forecast} is here"给log_fc的...参数时,glue默认会在**log_fc函数自身的环境**中查找变量forecast,但forecast是test_fc的局部变量,不在log_fc的环境范围内,因此抛出"object 'forecast' not found"的错误。
解决方案
有两种可行的修复方式,推荐第一种更通用的方案:
方案1:修改log_fc,指定glue的解析环境
给log_fc添加一个envir参数,默认使用parent.frame()(即调用log_fc的函数的环境),让glue在调用者的环境中解析变量:
log_fc <- function(type = c("INFO", "ERROR"), ..., envir = parent.frame()) { print( glue::glue("[{type} {Sys.time()}] ", ..., .envir = envir) ) }
此时调用test_fc(forecast = "d"),就能正常输出包含forecast值的日志:
[INFO 2024-05-20 15:30:00] d is here
方案2:在调用方提前解析glue字符串
如果不想修改log_fc,可以在test_fc中先完成变量解析,再把结果传给log_fc:
test_fc <- function(forecast) { log_fc(type = "INFO", glue::glue("{forecast} is here")) }
这种方式需要在每个调用log_fc的地方手动调用glue,适合简单场景。
原理说明
parent.frame()会返回当前函数的调用者环境,这里就是test_fc的执行环境,glue通过.envir参数指定这个环境后,就能找到forecast变量并完成解析。而glue默认的解析环境是当前函数(log_fc)的环境,里面不存在forecast变量,所以会报错。
内容的提问来源于stack exchange,提问作者sactyr
相关产品推荐
相关产品推荐

