使用styler对R代码进行样式化时,使用=而不是< -进行赋值

1tu0hz3e  于 2024-01-03  发布在  其他
关注(0)|答案(2)|浏览(123)

我喜欢这个包,但我想知道如何改变tidyverse风格中的一条规则:我想保留“=”而不是“<-”作为赋值。
我读过那张便条:http://styler.r-lib.org/articles/customizing_styler.html#implementation-details
但我仍然不知道如何简单地改变这一规则。我试过非常天真的:

library(styler)

force_assignment_op  <- function (pd) 
  {
    to_replace <- pd$token == "LEFT_ASSIGN"
    pd$token[to_replace] <- "EQ_ASSIGN"
    pd$text[to_replace] <- "="
    pd
 }

tidyverse_style()$token$force_assignment_op = force_assignment_op

字符串
但得到以下错误:

Error in tidyverse_style()$token$force_assignment_op = 
force_assignment_op : 
  invalid (NULL) left side of assignment


我想修改它的方式,我可以简单地运行styler插件后。

y3bcpkx1

y3bcpkx11#

问题是tidyverse_style()$token是一个列表,而不是一个环境,所以你不能修改它(当然,你可以修改它,但是你修改的是一个副本,而不是原始的)。
您需要编写自己的函数来替换tidyverse_style函数,并使用它。例如,假设您保留force_assignment_op函数:

LaSy_style <- function(...) {
  ts <- tidyverse_style(...)
  ts$token$force_assignment_op <- force_assignment_op
  ts
}

字符串
然后

style_text(c("ab <- 3", "a  <-3"), strict = FALSE, style = LaSy_style)


(one ?tidyverse_style中的示例)将打印

ab = 3
a  = 3


(This是丑陋的,原来的tidyverse_style更好,但我不会阻止你。

nbewdwxp

nbewdwxp2#

可以从tidyverse_style中派生出这样的样式。(如前面的回答中所述)下面的示例是所需的最小代码,只有大约20行给予和take。这个代码示例是从这里复制的。修改styler一个规则可能会有一些特殊的副作用,这需要更多的代码来处理。但是稍微修改一下就可以很好地完成。

rpolars_style = function() {
  # derive from tidyverse
  transformers = styler::tidyverse_style()
  transformers$style_guide_name = "rpolars_style"
  transformers$style_guide_version = "0.1.1"

  # reverse tranformer to make <- into =
  transformers$token$force_assignment_op = function(pd) {
    to_replace = pd$token == "LEFT_ASSIGN"

    # pretect against changing globalAssign operator, which does not have a unique defined token.
    if (any(to_replace)) {
      to_replace = to_replace & pd$text != "<<-"
    }

    pd$token[to_replace] = "EQ_ASSIGN"
    pd$text[to_replace] = "="
    pd
  }

  # Specify which tokens must be absent for a transformer to be dropped
  # https://styler.r-lib.org/reference/specify_transformers_drop.html?q=transformers%20_%20drop
  transformers$transformers_drop$token$force_assignment_op = "LEFT_ASSIGN"

  transformers
}

#use example
styler::style_dir(path = ".", style = rpolars_style())

字符串

相关问题