判断=是否在R代码中赋值的可靠方法?

Yih*_*Xie 14 r

我是一个顽固的使用者而=不是一直使用<-,显然很多R程序员都会对此不以为然.我写的formatR包可以替换=<-基于parser包.正如你们中的一些人可能知道的那样,parser几天前在CRAN上成了孤儿.虽然现在又回来了,但这让我对依赖它犹豫不决.我不知道是否有另一种方式来安全地更换=<-,因为不是所有=的意思分配,例如fun(a = 1).正则表达式是不太可靠(见第18行中的mask.inline()函数formatR),但我肯定会欣赏它,如果你能提高矿井.也许这个codetools包可以帮忙吗?

一些测试用例:

# should replace
a = matrix(1, 1)
a = matrix(
  1, 1)

(a = 1)
a =
  1

function() {
  a = 1
}

# should not replace
c(
  a = 1
  )

c(
  a = c(
  1, 2))
Run Code Online (Sandbox Code Playgroud)

Yih*_*Xie 4

Kohske向该包发送了一个拉取请求,formatR该包使用该包解决了问题codetools。基本思想是设置一个code walker来遍历代码;当它检测=到函数调用的符号时,它会被替换为<-。这是由于 R 的“Lisp 本质”:x = 1实际上是`=`(x, 1)(我们将其替换为`<-`(x, 1));当然,=在 的解析树中的处理是不同的fun(x = 1)

formatR包(>= 0.5.2)已经摆脱了对该parser包的依赖,replace.assign现在应该是健壮的。