我喜欢这个包,但我想知道如何改变 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
我想修改它,以便之后我可以简单地运行样式器插件。
问题是
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
更好,但我不会阻止你。)
可以从 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())
修改样式器规则可能会产生一些特殊的副作用。但经过一些测试,效果很好。