lintr为什么说“警告:全局变量'Cloaked'没有可见的绑定”?

时间:2018-07-09 00:41:27

标签: r lintr

我确定这是我的误解,因为我不是真正的R程序员...

我的代码在这里:https://gist.github.com/bnsh/3839c4eb2c6b31e32c39ec312014b2b8

#! /usr/bin/env Rscript

library(R6)

Cloaked <- R6::R6Class("Cloaked",
  public = list(
    msg = function() {
      return(paste(
        "this code _works_, but lintr (https://github.com/jimhester/lintr)",
        "complains that cloak_class.R:19:8: warning: no visible binding for",
        "global variable ‘Cloaked’ when I try to use Cloaked within a",
        "function. It's fine tho, if I use it _outside_ a function."
      ))
    }
  )
)

main <- function() {
  c <- Cloaked$new()
  c$msg()
}

main()

它有效...但是,lintr抱怨道:“ cloak_class.R:19:8:警告:全局变量'Cloaked'没有可见的绑定”

实际上,这与课程无关,因为这也会引起抱怨:

#! /usr/bin/env Rscript

cloaked <- function() {
  return(paste(
    "this code _works_, but lintr (https://github.com/jimhester/lintr)",
    "complains that cloak_function.R:13:3: warning: no visible global",
    "function definition for ‘cloaked’ when I try to use cloaked within",
    "a function. It's fine tho, if I use it _outside_ a function."
  ))
}

main <- function() {
  cloaked()
}

main()

此代码也可以运行,但是lintr说: cloak_function.R:13:3:警告:“隐藏的”没有可见的全局函数定义

为什么? 做一个诸如# nolint start / # nolint end之类的钝工具会简短,我该怎么做才能满足lintr的要求?

谢谢!

1 个答案:

答案 0 :(得分:0)

我刚开始使用lintr,遇到了同样的问题。看来是个错误。

https://github.com/REditorSupport/atom-ide-r/issues/7 和实际问题 https://github.com/jimhester/lintr/issues/27

目前唯一的解决方法(不足以修复lintr中的错误)是禁用对象linter(这不是很理想,因为它不会捕获这种形式的真正错误)。例如

with_defaults(object_usage_linter=NULL)

(我认为对象用法lint不是用于脚本,而是用于程序包,据我所知,要工作,它将评估整个脚本(!),以查看定义了什么全局变量。对于程序包,其中R文件都是很好的函数定义,但是对于脚本,您真的不想每次都在文件中都运行整个脚本)