这是一种情况,我有一个定义函数的文件,让我们称之为tmpFunctions.R
和一个使用它的文件(让我们称之为tmpRunner.R
)。
tmpFunctions.R
中的函数对无意使用从未在其中定义的变量,但在tmpRunner.R
中的全局范围中定义。因为,当从tmpRunner.R
调用函数时,变量已经存在于全局分数中,解释器不会发出任何错误并且程序运行顺利,但产生错误的结果。
这是一个例子:
tmpFuncitons.R:
my.func <- function(x){
return(X * 2) # typo; should be error
}
tmpRunner.R
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寻找源代码静态分析工具(在运行代码之前获取警告消息),但一无所获。