117

我(有点)已经知道这个问题的答案。但我认为这是 R 用户列表中经常被问到的问题,应该有一个可靠的好答案。 据我所知,R 中没有多行注释功能。那么,有人有什么好的解决方法吗?

虽然 R 中的大量工作通常涉及交互式会话(这让人怀疑是否需要多行注释),但有时我不得不将脚本发送给同事和同学,其中大部分涉及非平凡的代码块。对于来自其他语言的人来说,这是一个相当自然的问题。

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

"
Here's my multiline comment.

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

工作正常。有没有人有更好的解决方案?

4

11 回答 11

78

您可以在RStudio中轻松完成此操作:

选择代码并单击CTR++SHIFTC 注释/取消注释代码。

于 2013-04-14T11:54:55.110 回答
54

这确实经常出现在邮件列表中,例如,参见 r-help 上的这个最近的线程。共识答案通常是上面显示的:鉴于该语言没有直接支持,您必须要么

  • 使用具有区域到评论命令的编辑器,大多数高级 R 编辑器都可以
  • 使用if (FALSE)前面建议的结构,但请注意它仍然需要完整的解析,因此必须在语法上正确
于 2009-08-05T13:09:36.707 回答
44

我刚刚发现的 RStudio 的一个巧妙技巧是使用它#',因为这会创建一个自扩展的注释部分(当您从这样的行返回新行或将新行插入这样的部分时,它会自动注释)。

于 2013-06-04T09:42:32.880 回答
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()

[原答案]

这是另一种方式...查看底部的图片。将代码块剪切并粘贴到 RStudio 中。

使使用 IDE有效的多行注释是“好事”,大多数 IDE 或简单的编辑器在简单的注释块内没有突出显示文本;尽管有些作者花时间确保在此处字符串中进行解析。使用 R,我们也没有多行注释或此处的字符串,但是在 RStudio 中使用不可见的表达式可以提供所有这些好处。

只要在希望用于多行注释、此处字符串或未执行的注释块的部分中没有任何反引号,那么这可能是值得的。

#### 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!"

这是图片...

结构化评论

于 2012-11-22T01:31:04.893 回答
12

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

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

}
于 2009-08-05T11:17:04.837 回答
9

如果发现任何语言都不能满足这一点令人难以置信。

这可能是最干净的解决方法:

anything="
first comment line
second comment line
"
于 2012-11-04T09:46:05.097 回答
7

除了通过安装 RStudio 使用过分的方式来注释多行代码之外,您还可以使用Notepad++,因为它支持 R 的语法高亮

(选择多行)-> 编辑-> 注释/取消注释-> 切换块注释

请注意,您需要先将代码另存为 .R 源(以红色突出显示)

请注意,您需要先将代码另存为 .R 源(以红色突出显示)

于 2013-12-13T06:39:57.460 回答
2

我使用 vim 来编辑 R 脚本。

假设 R 脚本是 test.R,在 3 个单独的行上包含“第 1 行”、“第 2 行”和“第 3 行”。

我通过键入“vim test.R”在命令行上使用 Vim 打开 test.R。然后我转到我要注释掉的第一行,输入“Control-V”,向下箭头到我要注释掉的最后一行,输入大写字母 I 即“I”表示插入,输入“#”,然后点击 Escape 键,将“#”添加到我通过向下箭头选择的每一行。将文件保存在 Vim 中,然后键入 ":wq" 退出 Vim。更改应显示在 Rstudio 中。

要删除 Vim 中的注释,从要删除的字符“#”顶部的第一行开始,再次执行“Control-V”,然后向下箭头到要删除“#”的最后一行。然后输入“dd”。应删除“#”号。

在 Vim 中对 test.R 的更改反映在 Rstudio 中之间存在几秒钟的延迟时间。

于 2015-09-27T17:43:26.637 回答
2

现在有一个解决方法,通过使用包ARTofRbannerCommenter

这里的例子:

在此处输入图像描述

于 2021-10-13T10:36:37.353 回答
0

RStudio中,一个简单的方法是编写您的评论,一旦您使用 CTRL + Shift + C 来评论您的代码行,然后使用 CTRL + SHIFT + / 将您的评论重排到多行以便于阅读。

于 2017-12-28T11:03:17.160 回答
0

在 RStudio 中,您可以像这样使用井号和引号:

#' This is a comment

现在,每次你点击回车时,你不需要添加#',RStudio 会自动为你输入。

顺便说一句,为了添加参数和返回的项目,如果你在这些注释字符串中键入 @ 符号,为了标准化,RStudio 将自动向你显示与这些注释参数关联的代码列表:

#' @param tracker_df Dataframe of limit names and limits
#' @param invoice_data Dataframe of invoice data
#' @return return_list List of scores for each limit and rejected invoice rows
于 2020-12-17T13:41:04.280 回答