首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用分配via = in R

禁用分配via = in R
EN

Stack Overflow用户
提问于 2012-09-13 23:03:49
回答 4查看 1.6K关注 0票数 30

R允许通过<-=进行分配。

虽然两个赋值操作符之间都有一个细微差异,但似乎有一个广泛的共识,即<-=更好,因为=也被用作运算符将值映射到参数,因此它的使用可能导致歧义语句。以下是这方面的例子:

代码语言:javascript
复制
> 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抛出错误。

最优的情况是,这种行为只发生在全局环境中的代码中,因为附加名称空间中的代码很可能使用=进行赋值,并且不应该中断。

(这个问题是由与乔纳森·纳尔逊的一次讨论引起的)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-13 23:40:03

以下是一位候选人:

代码语言:javascript
复制
`=` <- 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
票数 37
EN

Stack Overflow用户

发布于 2012-09-13 23:40:15

我不确定,但也许简单地覆盖=的任务对您来说就足够了。毕竟,`=`和其他任何名字一样--几乎是。

代码语言:javascript
复制
> `=` <- function() { }
> a = 3
Error in a = 3 : unused argument(s) (a, 3)
> a <- 3
> data.frame(a = 3)
  a
1 3

因此,任何使用=进行赋值都会导致错误,而使用它命名参数仍然有效。它在函数中的使用可能会被忽略,除非实际执行所讨论的行。

票数 9
EN

Stack Overflow用户

发布于 2012-09-14 03:56:39

lint包(CRAN)有一个样式检查,因此假设您的代码在一个文件中,您可以对它运行lint,它将警告您使用=赋值的行号。

下面是一个基本的例子:

代码语言:javascript
复制
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

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

  • 警告注意正确的分配
  • 推荐=周围的空间
  • 建议逗号后面的空格
  • 建议插入之间的空格(a.k.a )。二进制运算符)
  • 警告标签
  • 警告最大线宽的可能性
  • 警告不要在函数调用中分配

您可以打开或关闭任何预定义的样式检查,也可以编写自己的样式。然而,这个包还处于起步阶段:它附带了一些bug (https://github.com/halpo/lint),文档也有点难消化。作者对此做出了回应,并在慢慢地进行改进。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12416030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档