【问题标题】:Split code over multiple lines in an R script在 R 脚本中将代码拆分为多行
【发布时间】:2011-09-13 20:53:34
【问题描述】:

我想将 R 脚本中的一行拆分为多行(因为它太长了)。我该怎么做?

具体来说,我有这样一行

setwd('~/a/very/long/path/here/that/goes/beyond/80/characters/and/then/some/more')

是否可以将长路径拆分为多行?我试过了

setwd('~/a/very/long/path/here/that/goes/beyond/80/characters/and/
then/some/more')

在第一行末尾带有return 键;但这不起作用。

谢谢。

【问题讨论】:

    标签: r multiline


    【解决方案1】:

    glue::glue 函数可以提供帮助。您可以在脚本的多行中编写一个字符串,但通过以\\ 结束每一行来从字符串对象中删除换行符:

    glue("some\\
         thing")
    
    something
    

    【讨论】:

      【解决方案2】:

      这将保留 \n 字符,但您也可以将引号括在括号中。在 RMarkdown 中特别有用。

      t <- ("
      this is a long
      string
      ")
      

      【讨论】:

      • 括号是干什么的?我没有发现包含或省略它们的任何效果。这似乎也没有回答问题,即如何在脚本的多行上编写单行字符串。
      【解决方案3】:

      我知道这篇文章很旧,但我遇到了这样的情况,只想分享我的解决方案。上面的所有答案都很好。但是,如果您有一个代码,例如 data.table 链接语法中的代码,它就会变得有点挑战。例如我遇到了这样的问题。

      mass &lt;- files[, Veg:=tstrsplit(files$file, "/")[1:4][[1]]][, Rain:=tstrsplit(files$file, "/")[1:4][[2]]][, Roughness:=tstrsplit(files$file, "/")[1:4][[3]]][, Geom:=tstrsplit(files$file, "/")[1:4][[4]]][time_[s]&lt;=12000]

      我尝试了上面的大多数建议,但都没有奏效。但我发现它们可以在[] 中的逗号后拆分。在][ 拆分不起作用。

      mass <- files[, Veg:=tstrsplit(files$file, "/")[1:4][[1]]][, 
          Rain:=tstrsplit(files$file, "/")[1:4][[2]]][, 
          Roughness:=tstrsplit(files$file, "/")[1:4][[3]]][, 
          Geom:=tstrsplit(files$file, "/")[1:4][[4]]][`time_[s]`<=12000]
      

      【讨论】:

      • 可能是您混淆了您要回答的问题吗?这与OP的问题无关。
      • 确实有。主要问题是如何将一行代码分成几行。我通过使用另一个比原始问题更复杂的示例来证明这一点。我认为有必要发布它,因为我花了很多时间试图弄清楚如何拆分那段特定的代码。我想它可以帮助有类似问题的人。
      • OP 的问题是用换行符分割字符向量包括字符向量中的换行符。您的答案仅针对 data.table 语法
      • 作为将一行代码拆分为多行的示例
      • 这个答案在问题的范围内,因为问题不清楚。有些人知道跨多行编写单行字符串是一种特殊情况,应该与通常如何拆分代码行分开提出一个问题,但许多会看到这个问题的人并不知道这一点。理想情况下,会有两个不同的问题,每个问题都包含一个链接,但这里已经有两个问题的答案。
      【解决方案4】:

      呸,cmets 太小了。不管怎样,@Dirk 说的很对。

      R 不需要被告知代码从下一行开始。它比 Python 更聪明 ;-) 并且只要它认为语句“未完成”,就会继续阅读下一行。实际上,在您的情况下,它也转到了下一行,但是当 R 放在“”之间时,它会将返回作为一个字符。

      请注意,您必须确保您的代码尚未完成。比较

      a <- 1 + 2
      + 3
      

      a <- 1 + 2 +
      3
      

      因此,当将代码分散到多行时,您必须确保 R 知道某些事情即将发生,或者通过:

      • 保持括号打开,或
      • 用运算符结束行

      当我们谈论字符串时,这仍然有效,但你需要小心一点。您可以打开引号,R 将继续阅读,直到您关闭它。但是每个字符,包括换行符,都将被视为字符串的一部分:

      x <- "This is a very
      long string over two lines."
      x
      ## [1] "This is a very\nlong string over two lines."
      cat(x)
      ## This is a very
      ## long string over two lines.
      

      这就是为什么在这种情况下,您的代码不起作用的原因:路径不能包含换行符 (\n)。所以这也是为什么你最好使用paste()paste0() Dirk 提出的解决方案。

      【讨论】:

      • 谢谢乔里斯。我看到了与您在一些在线文档中给出的示例相似的示例,并且也对字符串进行了尝试。我以为如果没有遇到结束引号,它将继续下一行。但是对于字符串它不起作用,或者更确切地说,正如你所说,它以不同的方式工作,因为它将输入作为换行符。
      • 感谢您阐明为什么有时您可以用加号分隔行!
      • 不,这里并不比 python 聪明。而不是paste("~one",\n"/two"),你只需要("~one" \n "/two")。去掉逗号和paste。不看语言smackdown。我使用这两种语言,但总是觉得粘贴很烦人。
      • @JorisMeys 是的,我试图纠正这种错误陈述。使用括号,你不需要“\”来继续行。我喜欢它,因为您还可以在无法使用“\”语法的行上使用 cmets(例如 ("one"\n "/one.one" # some comment\n "/two")' 中的示例 stackoverflow.com/questions/10660435/…
      • leaving a bracket open, or ending the line with an operator 这两个是要走的路。
      【解决方案5】:

      对于这种特殊情况,有file.path

      File <- file.path("~", 
        "a", 
        "very", 
        "long",
        "path",
        "here",
        "that",
        "goes",
        "beyond",
        "80",
        "characters",
        "and",
        "then",
        "some",
        "more")
      setwd(File)
      

      【讨论】:

        【解决方案6】:

        上述 Dirk 的方法绝对有效,但如果您正在寻找一种方法来引入一个长字符串,其中空格/结构对保留很重要(例如:使用 RODBC 的 SQL 查询),有一个两步解决方案。

        1) 将文本字符串带入多行

        long_string <- "this
        is 
        a 
        long
        string
        with
        whitespace"
        

        2) R 将引入一堆\n 字符。根据documentation,用strwrap() 删除这些空格,这会破坏空格:

        strwrap(long_string, width=10000, simplify=TRUE)
        

        通过告诉 strwrap 将您的文本换行到非常非常长的行中,您将获得一个没有空格/换行符的单个字符向量。

        【讨论】:

        • 我最喜欢这个答案,因为如果字符串相当长,我不必像粘贴那样写那么多逗号。 +1
        • 请注意strwrap 可能会返回多个字符串的向量,即使源字符串不超过 10k 个字符。试试strwrap("a\n\nb")。它将返回长度为 3 的向量,您需要使用 paste(strwrap("a\n\nb"), collapse=" ") 将其粘贴回来,并使用空格字符胶合来折叠向量。
        • 有人可以编辑答案以包含上一条评论中的重要信息吗?我不太明白这个问题,不想弄乱答案。
        • 我不明白“在哪里保留空白/结构很重要”是什么意思。这是否意味着保留在代码中或字符对象本身中?此外,生成的字符向量肯定有空格。我理解这个答案是关于如何用空格替换换行符,然后将每个空格的情况折叠为一个空格(除了保留一些标点符号后的双空格)。
        【解决方案7】:

        您不是将代码分解为多行,而是单个标识符。有区别。

        对于您的问题,请尝试

        R> setwd(paste("~/a/very/long/path/here",
                       "/and/then/some/more",
                       "/and/then/some/more",
                       "/and/then/some/more", sep=""))
        

        这也说明了跨多行中断代码是完全可以的。

        【讨论】:

        • 谢谢!我想知道是否有一个字符可以放在行尾以向 R 指示代码在下一行继续。如 Python 中的“\”。但是,您的解决方案适用于字符串延续的特定问题。
        • 或者你最好使用 paste0(...) 相当于 paste(..., sep="")
        • 但两年多前我写答案时,paste0 还不存在。
        • 看起来编辑被拒绝了,我或多或少同意拒绝。答案仍然是正确的,有它的上下文并且 cmets 会更新它。
        • 谢谢。我误会了您需要使用加号来拆分长行。我很高兴现实要简单得多!
        猜你喜欢
        • 1970-01-01
        • 2022-09-29
        • 1970-01-01
        • 2013-02-12
        • 1970-01-01
        • 2020-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多