RStudio测试包中未明确定义变量的定位求助
排查R包测试中隐藏变量定义的实用技巧
这问题我之前帮同行排查过类似的,给你几个针对性的方向,一步步来定位变量x的来源:
先直接查询变量的环境与位置
在测试脚本中变量x第一次出现的位置,插入两行代码:# 查看变量所在的环境 print(environment(x)) # 查找变量的搜索路径 print(find("x"))find("x")会返回变量被找到的环境名称(比如"package:你的包名"、"testthat"或者某个临时环境),environment(x)能告诉你变量具体存在哪个环境里,这一步能帮你快速缩小排查范围。检查测试框架的自动初始化逻辑
如果用的是testthat框架,测试运行时会自动执行一些前置代码:- 看看
tests/testthat/目录下有没有setup.R文件,这个文件会在所有测试前运行,很可能在这里定义了x; - 检查单个测试文件的开头,有没有隐藏的setup代码(比如用
testthat::setup()函数); - 另外,
devtools::load_all()(RStudio的Test Package默认用这个加载包)会触发包的初始化函数,比如.onLoad()、.onAttach(),去包的R/目录下搜这两个函数,看看里面有没有动态赋值x的逻辑。
- 看看
排查动态赋值的可能性
如果是用assign()函数动态创建的变量,普通的grep检索可能找不到(因为变量名是字符串形式)。可以试试在包的源码里搜索:grep -r "assign(" ./R ./tests或者更精准地搜包含
x的动态赋值:grep -r 'assign("x"' ./R ./tests另外,也可以在测试运行时,用
ls.str(envir = 你找到的环境)列出该环境下所有变量和它们的定义,看看能不能找到x的线索。检查包的命名空间隐藏变量
有时候变量可能存在包的命名空间里但没被导出,加载包时用户环境看不到,但测试运行时是在包的命名空间环境下执行的,所以能访问到。可以在测试脚本里试试:get("x", envir = asNamespace("你的包名"))如果能拿到值,就去包的
NAMESPACE文件和R/目录下的代码里找,有没有未导出的变量赋值(比如没有用export()导出的对象)。用调试器跟踪执行流程
在RStudio里给测试脚本的第一行设置断点,然后点击「Debug Test」一步步运行,观察变量x什么时候被创建出来。或者用命令行运行单个测试文件并开启调试:debug(testthat::test_file) testthat::test_file("tests/testthat/你的测试文件.R")跟着调试步骤走,就能精准找到变量被定义的位置。
内容的提问来源于stack exchange,提问作者Hauke L.
相关产品推荐
相关产品推荐

