28

最近,我发现自己使用的 R 代码在编码风格方面遍布地图 - 多个作者和不严格坚持单一结构的个人作者。有些任务我想比我现在做的更好地自动化。

我正在寻找一种工具(或多种工具)来管理以下任务 - 按愿望的递增顺序列出,但也按对存在的怀疑的递增顺序列出。

  • 基本格式。诸如将“if(foo)”转换为“if(foo)”并在大括号位置等方面实现统一之类的事情。

  • 将 "foo$blah" 转换为 "foo[["blah"]]" 以进行列表访问。理想情况下,它至少能够猜测一个对象是否真的是一个列表而不是一个 data.frame 并且只转换列表。

  • 将“=”转换为“<-”。是的,这是一个简单的搜索和替换 - 但不是真的。该工具(或正则表达式)需要具有语言意识,以便它知道转换“x = 5”而不是“foo(x=5)”。不仅要简单地替换符号,还要确保赋值运算符两侧都有一个空格,这也非常好。

  • 变量重命名,尤其是跨函数和文件。例如,假设一个列表有一个元素“foo”,我希望能够将其更改为“foobar”一次,而不必在整个代码流中跟踪该列表的每次使用。我想这将需要该工具能够进行整个控制流程,以便识别诸如在不同函数中作为另一个名称存在的列表之类的东西。

  • 命名约定。我希望能够定义一些标准命名约定(例如Google或其他),并让它识别所有函数、变量等并转换它们。请注意,这与之前的条目有关,例如列表元素。

随意列出基本的 unix 处理命令(例如 sed),只要它真的足够聪明,至少通常不会把事情搞砸(例如将“foo(x = 5)”转换为“foo(x <-5)” ”)。

我猜如果这样的工具已经以我现在已经听说过的完美状态存在,而且我也意识到使用像 R 这样的语言很难自动进行一些此类更改,但一个人可以做梦,对吧?有没有人对部分/所有这些有指点?

4

3 回答 3

4

由于这似乎仍然相关,我想提一下根据 tidyverse 样式重新格式化 r 代码的样式

它勾选了您的一些框,例如基本格式,但不会重命名变量(尽管linter lintr至少能够显示这些)。

Styler 是一个 R 包,带有接受代码的功能(例如style_text(),但它也可以在命令行上使用:

例如这段代码tmp.r

a <-c(1,2,3) 
if(foo) {
  b=2 }
myVar=2

并运行:

Rscript -e 'styler::style_file("tmp.r")'

会将 tmp.r 覆盖为:

a <- c(1, 2, 3)
if (foo) {
  b <- 2
}
myVar <- 2
于 2018-04-15T11:34:54.863 回答
2

恕我直言,写你自己的。写一个漂亮的打印机实际上是相当困难的。它需要理解标记化、解析、构建 AST 或其他 IR、跟踪符号表和范围、模板等。

但如果你能做到,那么总体上你真的会学到很多关于编程语言的知识。在你的同事看来,你也会给人留下深刻的印象,而且能投简历真是太棒了。这也很有趣。

我推荐 Terence Parr 的“语言实现模式:创建您自己的特定领域和通用编程语言”。读起来有点粗糙,但是内容还不错。它是在解析器的入门级编写的,而且很短,但它包含了您自己编写此工具所需的所有部分。

如果你确实构建它,开源它,回到这里告诉我们它,并建立一个带有一些广告的网站,让你自己赚几块钱。这样每个人都可以使用您的精彩创作,并且您将在此过程中获得几美元。

祝你好运...

于 2012-03-28T07:57:17.967 回答
0

我知道的两个是:

https://github.com/ropensci/Rclean

https://github.com/moodymudskipper/refactor

于 2021-09-13T16:56:38.363 回答