R中的变量声明/“选项显式”

时间:2014-07-17 08:37:07

标签: r

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 ***)

1 个答案:

答案 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)不再默默地给出错误答案......