通过=在R中禁用赋值

Hen*_*rik 30 r variable-assignment

R允许通过<-和分配=.

虽然两个赋值运算符之间存在细微差别,但似乎存在广泛的共识,这<-是比较好的选择=,因为=它也被用作参数的运算符映射值,因此它的使用可能导致含糊不清的语句.以下举例说明:

> system.time(x <- rnorm(10))
   user  system elapsed 
      0       0       0 
> system.time(x = rnorm(10))
Error in system.time(x = rnorm(10)) : unused argument(s) (x = rnorm(10))
Run Code Online (Sandbox Code Playgroud)

实际上,Google样式代码不允许使用=作业(请参阅此答案的评论以获得相反的观点).

我也几乎专门<-用作赋值运算符.然而,几乎在前一句中是这个问题的原因.当=我在我的代码中充当赋值运算符时,它总是偶然的,如果它导致问题,通常很难发现.

我想知道是否有办法关闭赋值=,让R抛出错误任何时候=用于赋值.

最佳地,这种行为只会发生在全局环境中的代码中,因为附加的命名空间中的代码很可能=用于赋值而不应该中断.

(这个问题的灵感来自与Jonathan Nelson的讨论)

Jam*_*mes 36

这是一个候选人:

`=` <- function(...) stop("Assignment by = disabled, use <- instead")
# seems to work
a = 1
Error in a = 1 : Assignment by = disabled, use <- instead
# appears not to break named arguments
sum(1:2,na.rm=TRUE)
[1] 3
Run Code Online (Sandbox Code Playgroud)

  • 这不应该影响其他包的代码.``=``这里被分配到全球环境中.在从包******中评估函数`foo`时,R的求值程序将在**bar**的命名空间中首先搜索`=`的值,然后在**bar**包的导入中搜索*,然后执行**然后*在`package:base`中.在搜索到达`.GlobalEnv`之前,它会找到一个未改变的`=`版本.很漂亮,恩赐? (8认同)

MvG*_*MvG 9

我不确定,但也许简单地覆盖分配=就足够了.毕竟,`=`这个名字和其他几乎一样.

> `=` <- function() { }
> a = 3
Error in a = 3 : unused argument(s) (a, 3)
> a <- 3
> data.frame(a = 3)
  a
1 3
Run Code Online (Sandbox Code Playgroud)

因此,任何=用于赋值的都将导致错误,而使用它来命名参数仍然有效.除非有问题的行实际执行,否则它在函数中的使用可能会被忽视.


flo*_*del 7

lint包(CRAN)有一个风格检查,所以假设你有一个文件你的代码,你可以针对它运行皮棉,它会警告你与那些行号=分配.

这是一个基本的例子:

temp <- tempfile()
write("foo = function(...) {
          good <- 0
          bad = 1
          sum(..., na.rm = TRUE)
       }", file = temp)

library(lint) 
lint(file = temp, style = list(styles.assignment.noeq))
# Lint checking: C:\Users\flodel\AppData\Local\Temp\RtmpwF3pZ6\file19ac3b66b81
# Lint: Equal sign assignemnts: found on lines 1, 3
Run Code Online (Sandbox Code Playgroud)

lint软件包附带了一些您可能感兴趣的测试,包括:

  • 警告反对正确的任务
  • 建议周围的空间 =
  • 逗号之后推荐空格
  • 推荐在中缀之间的空格(又名二元运算符)
  • 警告标签
  • 警告最大线宽的可能性
  • 警告函数调用中的赋值

您可以打开或关闭任何预定义的样式检查,您可以编写自己的样式检查.然而,该软件包仍处于起步阶段:它带有一些错误(https://github.com/halpo/lint),文档有点难以消化.作者虽然反应灵敏,但却在慢慢地进行改进.