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)
我不确定,但也许简单地覆盖分配=
就足够了.毕竟,`=`
这个名字和其他几乎一样.
> `=` <- 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)
因此,任何=
用于赋值的都将导致错误,而使用它来命名参数仍然有效.除非有问题的行实际执行,否则它在函数中的使用可能会被忽视.
该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),文档有点难以消化.作者虽然反应灵敏,但却在慢慢地进行改进.