【问题标题】:Is stricter error reporting available in R?R 中是否提供更严格的错误报告?
【发布时间】:2011-08-28 06:36:25
【问题描述】:

在 PHP 中,我们可以使用 error_reporting(E_ALL)error_reporting(E_ALL|E_STRICT) 来获得有关可疑代码的警告。在 g++ 中,您可以提供 -Wall(和其他标志)来对您的代码进行更多检查。 R中有类似的吗?

作为一个具体的例子,我正在将一段代码重构为一些函数。在其中一个函数中,我有这一行:

 if(nm %in% fields$non_numeric)...

很久以后,我意识到我忽略了将fields 添加到参数列表中,但 R 并没有抱怨未定义的变量。

【问题讨论】:

  • 我不确定您提到的具体问题是否真的可以通过更严格的警告来解决。如果它没有给出错误,那可能意味着fields 也是一个全局变量,这意味着引用它是合法的。如果你想显式声明全局变量,你可以通过大量的环境操作来做到这一点。
  • R 没有关于声明变量的特别严格的政策,它的范围是您应该阅读的内容(这将解释为什么它在您的示例中没有返回错误)。不过,您可以尝试options(warn=2) 将所有警告都转换为错误。
  • ?codetools::checkUsage 怎么样(codetools 是内置包)
  • 相关问题:“R 强制本地范围”-stackoverflow.com/q/6216968/602276
  • 在 cmets 中回答是怎么回事...? ;-)

标签: r compiler-warnings


【解决方案1】:

(作为答案而不是评论发布)

?codetools::checkUsage 怎么样(codetools 是内置包)...?

【讨论】:

  • checkUsage() 工作得非常好(包括指出第二个重构错误!),直到我将字段创建为全局。 (然后它无法检测到问题。)但是,结合操作环境(environment(myfunc)=parent.env(.GlobalEnv);checkUsage(myfunc))它可以作为 lint
【解决方案2】:

这不是一个真正的答案,我只是忍不住展示了如何显式声明全局变量。 @Ben Bolker 应该发表他的评论作为答案。

为避免看到全局变量,您可以在一个环境中“升级”一个函数——它将能够看到所有标准函数等(mean 等),但不能看到您放入全局环境中的任何内容:

explicit.globals = function(f) {
    name = deparse(substitute(f))
    env = parent.frame()
    enclos = parent.env(.GlobalEnv)

    environment(f) = enclos
    env[[name]] = f
}

那么获取全局只是从.GlobalEnv 中检索它:

global = function(n) {
    name = deparse(substitute(n))
    env = parent.frame()
    env[[name]] = get(name, .GlobalEnv)
}
assign('global', global, env=baseenv())

它会像这样使用

a = 2
b = 3

f = function() {
    global(a)

    a
    b
}
explicit.globals(f)

并像这样称呼

> f()
Error in f() : object 'b' not found

我个人不会这样做,但如果你习惯 PHP,它可能会有意义。

【讨论】:

    【解决方案3】:

    总结起来,确实没有正确的答案:正如 Owen 和 gsk3 所指出的,如果变量不在本地范围内,R 函数将使用全局变量。这在某些情况下可能是可取的,那么如何指出“错误”呢?

    checkUsage() 没有做 R 的内置错误检查没有做的事情(在这种情况下)。 checkUsageEnv(.GlobalEnv) 是检查辅助函数文件的有用方法(并且可能非常适合作为 svn 或 git 的预挂钩;或作为自动构建过程的一部分)。

    我觉得重构时最好的解决方案是:一开始就将所有全局代码移动到一个函数中(例如,调用它main()),然后唯一的全局代码就是调用它功能。先做这个,然后开始提取函数等。

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 2011-08-09
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-01
      • 2013-05-13
      相关资源
      最近更新 更多