【问题标题】:Multiline Comment Workarounds?多行注释解决方法?
【发布时间】:2010-11-16 21:38:22
【问题描述】:

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

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

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

运行 R 脚本
"
Here's my multiline comment.

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

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

【问题讨论】:

    标签: r comments r-faq


    【解决方案1】:

    您可以在RStudio 中轻松做到这一点:

    选择代码并点击CTR+SHIFT+C 注释/取消注释代码。

    【讨论】:

      【解决方案2】:

      这确实经常出现在邮件列表中,请参阅for example this recent thread on r-help。共识答案通常是上面显示的:鉴于该语言没有直接支持,您必须要么

      • 使用具有区域到评论命令的编辑器,大多数高级 R 编辑器都这样做
      • 使用前面建议的 if (FALSE) 构造,但请注意,它仍然需要完整的解析,因此必须在语法上正确

      【讨论】:

      • 谢谢。您是否介意扩展一下多线 cmets 是否有前景,是否是哲学问题等?
      • 我认为这是由于解析器的性质,以及 R 也是一个交互式环境(即:命令行)而不是多行 cmets 的基于文件的解释器这一事实会更常见。所以不是哲学的——它是这样发展的。
      • 既然 R 已经编译了代码,我们认为多行 cmets 会出现吗?
      • 不,因为底层解析器没有改变。
      • 刚刚发布了一个不需要正确语法的答案,尽管它比简单的代码块启用/禁用切换更适用于此处字符串类型的文档和评论。
      【解决方案3】:

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

      【讨论】:

      • +1 但我首先弄错了——也许这更具可读性:#'
      • 这很好!很棒的一个。有人应该将此答案与@Salvador 提供的答案结合起来,因为它们可以在不同的情况下使用。
      【解决方案4】:

      [更新]基于cmets。

      # 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更多 有效的多行 cmets 是“好事”,大多数 IDE 或简单的编辑器在简单的注释掉块内没有突出显示文本;尽管有些作者花时间确保在此处字符串中进行解析。使用 R,我们也没有多行 cmets 或 here-strings,但在 RStudio 中使用不可见的表达式会带来所有好处。

      只要该部分中没有任何反引号可用于多行 cmets、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!"
      

      这是图片...

      【讨论】:

      • 我认为您可以定义comment=function(z){invisible(expression(z))},这可能有助于人们了解到底发生了什么!
      • 也许更好,Comments&lt;-function(`@Comments`)rm(`@Comments`)。由于评论已经是一个有效的功能。
      • 你真的需要对 arg 做任何事情吗? Comments=function(x){} 适用于 x 是由反引号分隔的多行表达式。它不会尝试评估它...
      • 当空括号不包含 invisible() 时,带有 echo 的源显示 NULL
      • 但是Comment &lt;- function(`@Comments`) {invisible()},如果评论太长,会报错:variable names are limited to 10000 bytes
      【解决方案5】:

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

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

      【讨论】:

      • 有什么方法可以修改这个,如果 FALSE 被更改为 TRUE,它会在大括号内运行多行代码而不是最后一行?
      【解决方案6】:

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

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

      anything="
      first comment line
      second comment line
      "
      

      【讨论】:

      • 工作正常,除非你想在你的评论中引用引号 ;)
      【解决方案7】:

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

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

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

      【讨论】:

        【解决方案8】:

        我使用 vim 来编辑 R 脚本。

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

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

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

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

        【讨论】:

          【解决方案9】:

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

          这里的例子:

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              在 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
              

              【讨论】:

                猜你喜欢
                • 2011-04-06
                • 1970-01-01
                • 2022-06-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-01-31
                • 1970-01-01
                • 2013-12-03
                相关资源
                最近更新 更多