r - R CMD 检查注意:`No visible binding for global variable`,当在 S3 泛型中定义变量并在方法中使用它时
问题描述
考虑以下代码:
greet <- function(object) {
greeting <- "hola"
UseMethod("greet", object)
}
greet.character <- function(object)
paste(greeting, object)
greet("stackoverflow")
#> [1] "hola stackoverflow"
由reprex 包(v0.3.0)于 2021 年 2 月 3 日创建
显然,greet.character
method 的执行环境填充了泛型 before 中创建的变量UseMethod()
,因此代码按预期工作。
但是,在包中包含这些定义将在 R CMD 检查时导致以下注释:
> checking R code for possible problems ... NOTE
greet.character: no visible binding for global variable ‘greeting’
Undefined global functions or variables:
greeting
您可以在此存储库中找到说明该问题的示例包。
现在,我知道我可以用 关闭 NOTE globalVariables()
,但我仍然对 NOTE 的起源感到困惑。所以我的问题是:
为什么上面的例子应该被认为是 R 包中的“不好的做法”,有什么内在的原因吗?在现实生活中的示例中,我使用这样的构造来避免几种方法中的代码重复。
如果没有,有没有比使用更好的选择
globalVariables()
?
解决方案
回答我自己,我认为这种做法会导致令人困惑的行为,因为会UseMethod()
生成具有相同参数的适当方法的调用;暗示对作为泛型参数的变量的修改(不像greeting
我上面的示例)不会传播到方法。
现在,我正在定义要在每个方法开始时调用的额外函数,以执行我最初在泛型中执行的复杂计算。如果这些函数需要很多参数,这也会导致代码繁琐,但这是我迄今为止找到的最佳解决方案。
我将把这个开放一段时间,看看是否有人有其他方法可以提出。
推荐阅读
- linux - 如何以非零状态码退出 for 循环?
- php - 如何解析包含多维数组的对象
- javascript - 在静态网站的 Typescript 中导入库时出错
- javascript - 监听较长过渡的transitionend事件
- mysql - MySQL如何在JSON字段中搜索与JSON值相交的所有行
- r - 生成一系列有序的日期时间
- spring-boot - 从自定义 testng 框架启动 spring boot mvc 测试
- python - 如何从外部文本文件中对得分最高的人进行排序,并与获得这些分数的人的姓名保持联系?Python
- acumatica - 有没有办法在自定义屏幕中设置网格列的默认顺序?
- python - 如何将标准 Yum 输出保存到 Python Yum API 的变量中?