使用 = 代替 <- for assignment when styling R code with styler

问题描述 投票:0回答:2

我喜欢这个包,但我想知道如何改变 tidyverse 风格的一条规则:我想保留“=”而不是“<-" for assignment.

我已阅读该注释: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

我想修改它,以便之后我可以简单地运行样式器插件。

r tidyverse assignment-operator
2个回答
6
投票

问题是

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)

?tidyverse_style
中的示例之一)将打印

ab = 3
a  = 3

(这很难看,原来的

tidyverse_style
更好,但我不会阻止你。)


0
投票

可以从 tidyverse_style 派生出这样的样式。下面的示例是所需的最少代码,大约只有 20 行。 此代码示例是从此处复制的。

#' The rpolars style
#' Prepare rpolars style (the function that output the set transformers and name/version)
#' @return transformers - see styler package
#' @examples rpolars_style()
rpolars_style = function() {
  # derive from tidyverse
  transformers = styler::tidyverse_style()
  transformers$style_guide_name = "rpolars_style"
  transformers$style_guide_version = "0.1.0"

  # reverse tranformer to make <- into =
  transformers$token$force_assignment_op = function(pd) {
    to_replace = pd$token == "LEFT_ASSIGN"
    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())

修改样式器规则可能会产生一些特殊的副作用。但经过一些测试,效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.