多行注释的解决方法?

124

我(有点)已经知道这个问题的答案。但我认为这是R用户列表经常问到的问题之一,因此应该有一个完整且好的答案。据我所知,在R中没有多行注释功能。那么,是否有任何好的解决方法?

虽然在R中进行许多工作通常涉及交互式会话(这引起了对多行注释的需求的疑问),但有时我不得不向同事和同学发送脚本,其中包括许多非平凡的代码块。对于来自其他语言的人来说,这是一个相当自然的问题。

过去我使用引号。由于字符串支持换行符,在R脚本中运行:

"
Here's my multiline comment.

"
a <- 10
rocknroll.lm <- lm(blah blah blah)
 ...

这个方案很好,有没有更好的解决方案呢?


我最好的建议是编写一个宏(或插件,如果您使用类似Sublime Text 2的东西),并分配一个键绑定,这样一旦您按下适当的键绑定,所选文本(即注释)就会在前面加上#。 - Maiasaura
2
如果您还没有尝试过Rstudio,我绝对会推荐它。我认为您可以轻松地注释/取消注释多行代码。 - Xu Wang
2
Notepad++ 可以识别 R 语言,并允许对代码进行块注释。 - Michelle
3
Notepad++中的Ctrl+Q,RStudio中的Ctrl+Shift+C:
  • Ctrl+Q 在Notepad++中是用来折叠当前行或者选中的一段代码的快捷键。
  • Ctrl+Shift+C 在RStudio中则是用来注释/取消注释当前选中的一段代码的快捷键。
- Michael Szczepaniak
16个回答

118

大多数编辑器都有一些快捷方式来注释掉代码块。 默认编辑器使用类似于 command 或 control 和单引号的方式来注释选定的代码行。在 RStudio 中,使用的是CommandControl + /。请检查你的编辑器。

仍然是逐行注释,但它们也可以取消选定的行。对于 Mac RGUI,它是 command-option'(我想象 Windows 是 control option)。对于 Rstudio,只需再次使用CommandControl+Shift+C即可。

随着编辑器更新和不同软件成为最受欢迎的 R 编辑器,这些快捷键可能会随时间而变化。你需要查找你所使用的软件的相关信息。


3
没问题,这是一个非常方便的功能。在Emacs中,只需高亮要注释的区域,然后输入C-x r t,然后输入你想添加的字符(例如"##")。要缩进代码块以适用于SO,请执行相同的操作,但将最后三个字符替换为四个空格! - Josh O'Brien
2
在Emacs中,您还可以使用M-x comment-region。不知道C-x r,谢谢! - Sacha Epskamp
24
CTRL+SHIFT+C键可以在eclipse/StatET中对所选内容进行注释或取消注释。 - Richie Cotton
18
在OSX中,R Studio的快捷键是Cmd+Shift+C。 - prototype
7
在Windows系统中,在RStudio中复制命令的快捷键是Ctrl + Shift + C。 - s_scolary
显示剩余6条评论

80
您可以在RStudio中轻松完成此操作: 选择代码,然后单击CTR+SHIFT+C以注释/取消注释代码。

74

一种类似块注释的方法使用了if语句:

if(FALSE) {
  all your code
}

虽然这个方法有效,但我几乎总是使用我的编辑器的块注释选项(比如 RStudio、Kate 和 Kwrite)。


1
现在学习R,真是太棒了。 - jds
2
这难道不会给检查语法的任何工具带来问题吗? - sebastian-c
有点不正统,但是只要能用就行了。 :) - Lycanthropeus

55

这个问题在邮件列表上经常出现,例如最近在r-help上的线程。通常一致的答案是:考虑到该语言没有直接支持,您必须要么:

  • 使用具有区域注释命令的编辑器,大多数高级 R 编辑器都有此功能。
  • 使用先前提到的if (FALSE) 结构,但请注意它仍然需要完全解析,并且必须是语法正确的。

谢谢。您介意再详细说明一下是否有多行注释的前景,这是否是一种哲学上的东西等吗? - HamiltonUlmer
1
我认为这是解析器的本质和R也是一个交互式环境(即:命令行),而不是大多数情况下基于文件的解释器,其中多行注释更常见。因此并非哲学问题 - 它是这样发展起来的。 - Dirk Eddelbuettel
现在R已经编译代码了,我们认为多行注释会出现吗? - Ari B. Friedman
不,因为底层解析器没有改变。 - Dirk Eddelbuettel
刚刚发布了一个答案,它不需要正确的语法,虽然它更多地用于字符串类型的文档和注释,而不是简单的代码块启用/禁用切换。 - Thell

45
我刚刚发现了一个RStudio的好技巧,就是可以使用#'来创建自动扩展的注释部分(当你从这样一行返回到新行或在这样的部分中插入新行时,它会自动变成注释)。

1
+1 但我第一次弄错了 -- 或许这个更易读:#' - bluenote10
这很棒!太好了。有人应该将这个答案与@Salvador提供的答案结合起来,因为它们可以在不同的情况下使用。 - API

37

将其包装在一个未使用的函数中:

.f = function() {

## unwanted code here:

}

21
[更新] 基于评论。
# An empty function for Comments
Comment <- function(`@Comments`) {invisible()}

#### Comments ####
Comment( `

  # Put anything in here except back-ticks.

  api_idea <- function() {
    return TRUE
  }

  # Just to show api_idea isn't really there...
  print( api_idea )

`)
####

#### Code. ####
foo <- function() {
  print( "The above did not evaluate!")
}
foo()

[Translated Answer]

这里有另一种方法...请查看底部的图片。将代码块复制并粘贴到RStudio中。

使用IDE更加有效的多行注释是“好事”,大多数IDE或简单编辑器都没有突出显示简单注释块内的文本;虽然有些作者花费了时间确保在here-strings中进行解析。对于R,我们没有多行注释或here-strings,但在RStudio中使用不可见表达式可以获得所有这些好处。

只要所需部分中没有反引号用于多行注释、here-strings或非执行注释块,则这可能是值得一试的东西。

#### Intro Notes & Comments ####
invisible( expression( `
{ <= put the brace here to reset the auto indenting...

  Base <- function()
  {      <^~~~~~~~~~~~~~~~ Use the function as a header and nesting marker for the comments
         that show up in the jump-menu.
         --->8---
  }

  External <- function()
  {
    If we used a function similar to:
      api_idea <- function() {

        some_api_example <- function( nested ) {
          stopifnot( some required check here )
        }

        print("Cut and paste this into RStudio to see the code-chunk quick-jump structure.")
        return converted object
      }

    #### Code. ####
    ^~~~~~~~~~~~~~~~~~~~~~~~~~ <= Notice that this comment section isnt in the jump menu!
                                  Putting an apostrophe in isn't causes RStudio to parse as text
                                  and needs to be matched prior to nested structure working again.
    api_idea2 <- function() {

    } # That isn't in the jump-menu, but the one below is...

    api_idea3 <- function() {

    }

  }

    # Just to show api_idea isn't really there...
    print( api_idea )
    }`) )
####

#### Code. ####
foo <- function() {
  print( "The above did not evaluate and cause an error!")
}

foo()

## [1] "The above did not evaluate and cause an error!"

以下是图片...

结构化评论


1
我认为你可以定义comment=function(z){invisible(expression(z))},这可能有助于人们理解到底发生了什么! - Spacedman
1
也许更好的方法是 Comments<-function(\@Comments`)rm(`@Comments`)`。因为comment已经是一个有效的函数了。 - Thell
1
你需要对参数进行实际操作吗?当x是由反引号分隔的多行表达式时,Comments=function(x){}将起作用。它不会尝试对其进行评估... - Spacedman
当空括号不包含invisible()时,带有echo的源代码显示为NULL。 - Thell
但是使用“Comment <- function(@Comments){invisible()}”时,如果注释太长,您会收到错误消息:“变量名称限制为10000个字节”。 - pixel

13

我可以想到两个选项。第一个选项是使用允许块注释和取消注释的编辑器(例如Eclipse)。第二个选项是使用if语句。但那只能让你“注释”正确的R语法。因此,一个好的编辑器是首选的解决方法。

if(FALSE){
     #everything in this case is not executed

}

有没有办法修改这个代码,如果将FALSE更改为TRUE,它会运行花括号内的多行代码而不仅仅是最后一行? - coip

10

我觉得任何一种语言都应该支持这个功能,这让我感到难以置信。

这可能是最简洁的解决方法:

anything="
first comment line
second comment line
"

4
除非您在评论中需要引号,否则一切正常。;) - abalter

7
除了通过安装RStudio来使用过度注释多行代码的方式,您还可以使用Notepad++,因为它支持R的语法高亮显示。
(选择多行)-> 编辑 -> 注释/取消注释 -> 切换块注释
请注意,您需要首先将代码保存为.R源文件(用红色突出显示)。 Note that you need to save the code as a .R source first (highlighted in red)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接