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))实际上,谷歌风格代码不允许使用=进行赋值(相反的视图请参见对此回答的注释)。
我也几乎完全使用<-作为赋值运算符。然而,几乎在前一句中是提出这一问题的原因。当=在我的代码中充当赋值运算符时,它总是偶然的,如果它导致问题,通常很难发现。
我想知道是否有一种方法可以通过= = 关闭赋值,并在使用=进行赋值时让R抛出错误。
最优的情况是,这种行为只发生在全局环境中的代码中,因为附加名称空间中的代码很可能使用=进行赋值,并且不应该中断。
(这个问题是由与乔纳森·纳尔逊的一次讨论引起的)
发布于 2012-09-13 23:40:03
以下是一位候选人:
`=` <- 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发布于 2012-09-13 23:40:15
我不确定,但也许简单地覆盖=的任务对您来说就足够了。毕竟,`=`和其他任何名字一样--几乎是。
> `=` <- function() { }
> a = 3
Error in a = 3 : unused argument(s) (a, 3)
> a <- 3
> data.frame(a = 3)
a
1 3因此,任何使用=进行赋值都会导致错误,而使用它命名参数仍然有效。它在函数中的使用可能会被忽略,除非实际执行所讨论的行。
发布于 2012-09-14 03:56:39
lint包(CRAN)有一个样式检查,因此假设您的代码在一个文件中,您可以对它运行lint,它将警告您使用=赋值的行号。
下面是一个基本的例子:
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, 3lint包还附带了一些您可能感兴趣的测试,包括:
=周围的空间您可以打开或关闭任何预定义的样式检查,也可以编写自己的样式。然而,这个包还处于起步阶段:它附带了一些bug (https://github.com/halpo/lint),文档也有点难消化。作者对此做出了回应,并在慢慢地进行改进。
https://stackoverflow.com/questions/12416030
复制相似问题