在完全实施之前的解决方法是将this post 中解释的用户定义一元运算符与漂亮的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), "\\%"))
}
}
这还允许用户为特殊格式的 cmets 制作查找表或定义其他行为,例如函数调用。这甚至可以扩展到双向通信,例如发送电子邮件,其中包含由svDialogs 框收集的数据以及personList() 元数据等。
"a" %comment%.
"" %comment%.
注意中缀运算符后面的点。该函数完全忽略了这一点,并且可以让 R 解释器物有所值。您可以在此处放置其他特殊格式的内容,这些内容不会被评估,但要注意运算符优先级。这可能会导致奇怪的行为,我不建议这样做。例如,R 可能会有点抱怨,但以下会运行良好。
"1" %comment% TRUE^Inf/0&NA_complex_
所有特殊格式的文件都会阻塞 Rscript,阻止编织文件正确运行等等。这是一个将脚本中的任何特殊注释格式化为常规 cmets 的函数。
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()运行