RStudio 中的颜色编码注释

Colour coding comments in RStudio

我是一个非常注重视觉的人,想要区分 #a command I commented out##message for myself or co-worker on the file。我环顾了一下 RStudio 是否支持不同类型的评论,但它似乎并不支持。有人知道解决这个问题的方法吗?

谢谢!

如前所述,这不是一个 R 问题,而是一个 RStudio 问题(我已经这样编辑了)。 RStudio 目前没有用户可修改的主题,只有内置主题。这显然是一个开发中的功能。

与此同时,显然您可以破解定义主题的 .css 文件,或许可以添加您想要的内容 - https://support.rstudio.com/hc/en-us/community/posts/200644098-appearance-Editor-theme

否则,您可以使用其他编辑器来指定所需的语法突出显示。

您可以使用

#'* some colorfull comment *

以颜色评论。

-R 版本 3.6.3 -RStudio ‘1.2.5033 "Orange Blossom"

#'[Red]

#'@Purple    

#'*Green*

在完全实施之前的解决方法是将 中解释的用户定义的一元运算符与漂亮的 crayon 包结合起来。

`%/*/<-%` <- function(name, FUN, safe = TRUE) {
  `%//%` <- paste0
  NAME <- "%" %//% name %//% "%"
  PARENT <- parent.frame()
  if (safe && exists(NAME, PARENT)) {
    stop(NAME %//% " exists.")
  }
  assign(
    x = NAME,
    value = function(x, ignored) FUN(x),
    envir = PARENT
  )
}

`%comment%` <- "comment" %/*/<-% function(x){
  cat(crayon::bgRed(x))
}

这为我们提供了一个新的中缀运算符 %comment%,我们可以为其定义要发送到控制台的颜色或打印样式。

"hi there" %comment%.

#and to remove the operator
rm(`%comment%`)

rstudioapi 包进一步扩展了人们可以由此实现的可能性。

`%comment%` <- "comment" %/*/<-% function(x){
  if (startsWith(x, "a")) {
    str <- paste("Hi", Sys.info()[6], "please leave a comemnt!", sep = " ")
    cat(crayon::blue(str))
  } else {
    rstudioapi::insertText(
      text =
        paste0("\%",
               switch(x,
                      "1" = {"an entire story to be told"},
                        NA), "\%"))
  }
}

这还允许用户为特殊格式的评论制作查找表或定义其他行为,例如函数调用。这甚至可以扩展到双向通信,例如发送电子邮件,其中包含 svDialogs 盒子收集的数据以及 personList() 元数据等。

"a" %comment%.
"" %comment%.

注意中缀运算符后面的点。这完全被函数忽略了,并且可以给 R 解释器一个 运行 的钱。你可以在这里放置额外的特殊格式的东西,这些东西不会被评估,但要注意运算符的优先级。这可能会导致奇怪的行为,我不建议这样做。例如,R 可能会有点抱怨,但下面的 运行 没问题。

"1" %comment% TRUE^Inf/0&NA_complex_

所有那些特殊格式的都可以阻塞 Rscript,阻止编织文件 运行 正确等等。这是一个函数,用于将脚本中完成的任何特殊注释格式化为常规注释。

clean <- function(detach = TRUE) {
  x <- rstudioapi::getActiveDocumentContext()
  cleaner <- function(doc, detach) {
    clean_ind <- which(stringi::stri_detect(
      str = doc$contents,
      regex = "%comment%"
    ) == T)
    for (i in seq_along(clean_ind)) {
      rstudioapi::modifyRange(
        id = doc$id,
        text = "# ",
        location = rstudioapi::document_position(
          row = clean_ind[i], column = 1
        )
      )
    }
  }
  tryCatch(expr = {
    rstudioapi::sendToConsole(cleaner(doc = x, detach = detach),
                              execute = TRUE, focus = FALSE
    )
  }, error = function(cond) {
    # rstudioapi code parameter returns error (is not character), but works
    return("Script cleaned")
  })
}

运行 只需 clean()