R非常棒:精益而灵活,但功能强大且开放。对于小任务,如果在使用之前不必声明每个变量,则很方便。但是:尤其是在较大的项目中,小错别字可能会搞乱一切,甚至可能没有错误消息(参见示例)!
有解决方法吗?如果不在普通R中,可能还有一个要求声明块的编辑器? VBA中的“明确选项”之类的东西?我知道在标记它时RStudio编辑器中相同变量的非常好的突出显示,但是如果有问题的变量相距很远,那么它就变得不那么有用了。
为了清楚起见:我不是在寻找一个更优雅/更不容易出错的函数实现,这个函数只是为了提供演示而创建的。
# without typo
fun <- function(x) {
a <- x
if (a<0) {
if (a > -50) x <- -1 else x <- -2
}
return(x)
}
# even if masters will spot the typo on the first glance...
fun.typo <- function(x) {
a <- x
if (a<0) {
if (a > -50) x <- -1 else X <- -2
}
return(x)
}
fun( 50) # 50
fun(-40) # -1
fun(-60) # -2
fun.typo( 50) # 50
fun.typo(-40) # -1
fun.typo(-60) # -60 (*** unintended, should be -2 ***)
答案 0 :(得分:2)
非常&#34;脏&#34;解决方案是在&#34;前导码&#34;之后系统地检查功能的本地环境是否未改变。
fun <- function(x) {
a <- x
ls1 <- ls()
if (a<0) {
if (a > -50) x <- -1 else x <- -2
}
ls2 <- ls()
print(list(c(ls1,"ls1"),ls2))
if (!setequal(c(ls1,"ls1"), ls2)) stop("Something went terribly wrong!")
return(x)
}
fun.typo <- function(x) {
a <- x
ls1 <- ls()
if (a<0) {
if (a > -50) x <- -1 else X <- -2
}
ls2 <- ls()
print(list(c(ls1,"ls1"),ls2))
if (!setequal(c(ls1,"ls1"), ls2)) stop("Something went terribly wrong!")
return(x)
}
有了这个&#34;解决方案&#34;,fun.typo(-60)
不再默默地给出错误答案......