1

这是一种情况,我有一个定义函数的文件,我们称之为它tmpFunctions.R和一个使用它的文件(我们称之为它tmpRunner.R)。函数 in无意中tmpFunctions.R使用了一个从未在其中定义但在全局范围中定义的变量。由于在调用函数时,该变量已经存在于全局分数中,因此解释器不会发出任何错误,程序运行顺利,但会产生错误的结果。这是一个例子:tmpRunner.RtmpRunner.R

tmpFuncitons.R:

my.func <- function(x){
  return(X * 2) # typo; should be error
}

tmpRunner

source('tmpFunctions.R')
X <- 10  #calling my.func(...) from this point on will not cause runtime errors
for(i in seq(10)){
  print(sprintf('%s ==> %s', i, my.func(i)))
}

输出:

> source('C:/tmp/tmpRunner.R')
[1] "1 ==> 20"
[1] "2 ==> 20"
[1] "3 ==> 20"
[1] "4 ==> 20"
[1] "5 ==> 20"
[1] "6 ==> 20"
[1] "7 ==> 20"
[1] "8 ==> 20"
[1] "9 ==> 20"
[1] "10 ==> 20"

有没有办法通过类似于 Perl 的东西来防止这种情况use strict,将函数导入tmpFunctions.R而不将它们暴露在全局范围内(很可能不是)?

我还尝试寻找 R 的源代码静态分析工具(在运行代码之前获取警告消息),但什么也找不到。

4

0 回答 0