在R脚本中多行分割代码

问题描述 投票:129回答:5

我想将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
5个回答
101
投票

您不是在多行上打破code,而是单个标识符。有区别。

关于您的问题,请尝试

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

这也说明跨多行破坏代码是完全可以的。


136
投票

Bah,评论太小。无论如何,@ Dirk是非常正确的。

R无需告知代码从下一行开始。它比Python更聪明;-),并且只要认为该语句为“未完成”,就会继续读取下一行。实际上,在您的情况下,它也转到了下一行,但是当R放在“”之间时,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)。因此,这也是为什么您最好将Dirk建议的解决方案与paste()paste0()结合使用。


31
投票

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

1)跨多行输入文本字符串

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

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

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

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


14
投票

在特定情况下,有file.path

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

0
投票

我知道这篇文章很旧,但是我遇到了这样的情况,只想分享我的解决方案。以上所有答案都可以正常工作。但是,如果您有诸如data.table链接语法中的代码,这将变得有些挑战。例如我遇到了这样的问题。

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]

我尝试了上面的大多数建议,但没有用。但是我发现它们可以在[]中用逗号分隔。在][处分割无效。

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]
© www.soinside.com 2019 - 2024. All rights reserved.