将target对象作为Quarto代码块选项输入时的行为不一致问题咨询
这是预期行为,和执行环境的差异有关
你遇到的这个不一致情况其实是targets和Quarto集成时的设计逻辑导致的,完全符合预期,我给你拆解下背后的原因:
1. echo选项的执行环境
当你在Quarto代码块里用#| echo: !expr id时,这个表达式是在你运行tar_make()的主R环境里求值的。这时候你已经通过tar_load(id)把targets对象加载到了主环境中,所以id变量是存在的,echo选项能正常判断是否显示代码块。
2. eval选项的特殊执行逻辑
而eval选项就不一样了:Quarto在执行代码块的eval逻辑时,会创建一个独立的沙箱环境,这个环境不会自动继承主环境里通过tar_load()加载的变量。这是为了保证报告的可复现性,避免主环境的临时变量干扰代码块的执行。
这时候如果用#| eval: !expr id,沙箱环境里找不到id这个变量,自然就会报“object 'choice' not found”的错误。而tar_read(choice)是直接从targets的缓存目录里读取对应的对象,不需要依赖当前环境的变量,所以能在沙箱环境里正常执行。
总结正确用法
- 控制代码块显示(
echo):可以用tar_load()加载后的变量,因为是在主环境求值 - 控制代码块执行(
eval):必须用tar_read()直接读取targets对象,确保环境独立,避免报错
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

