假设我的包装中有一个函数
my_fn <- function() {
mtcars_dt <- data.table::data.table(mtcars)
mtcars_dt[, mpg_div_hp := mpg / hp]
mtcars_dt
}
在我的.Renviron
中,设置为_R_CHECK_CODETOOLS_PROFILE_="suppressUndefined=TRUE"
。这样可以确保在codetools
期间运行R CMD check
软件包时,它不会返回任何警告,例如
my_fn: no visible binding for global variable 'mpg_div_hp'
但是,如果我定义了一些全局变量,例如
utils::globalVariables(c("mpg", "hp"))
在我的包装文档中,R CMD check
将把 all 变量标识为未绑定。好像globalVariables()
函数正在覆盖我的"suppressUndefined=TRUE"
文件中的.Renviron
选项。
我的问题是为什么会这样?有关更多背景信息,请继续阅读。
看似有两个“简单”解决方案:
package.R
文件中定义任何变量,并允许codetools
选项处理所有变量。globalVariables()
函数中定义所有全局变量,并且不要使用codetools
选项。不幸的是,如果您想使用lintr
包,则第一个选项不是很好,因为lintr
仅检查函数mpg_div_hp := mpg / hp
部分的RHS。因此,在"mpg"
函数中包含变量"hp"
和globalVariables
就是为什么我遇到这个问题的原因。当然,我可以为object_usage_linter=NULL
使用lintr
选项,但这并不令人满意。第二种选择将需要一个大于1000个变量的向量,这似乎不是一个很好的解决方案。