在R脚本中将代码拆分为多行


137

我想将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在第一行的末尾带有密钥;但这不起作用。

谢谢。

Answers:


107

您不是在多行代码上打乱代码,而是在一个标识符上打断代码。它们是有区别的。

对于您的问题,请尝试

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

这也说明跨多行破坏代码是非常好的。


13
谢谢!我想知道是否可以在行末添加一个字符以向R指示代码在下一行继续。如Python中的“ \”。但是,您的解决方案对于字符串连续的特定问题效果很好。
Curious2learn 2011年

14
或者您最好使用paste0(...)等效于paste(...,sep =“”)
gkcn 2013年

31
但是2 paste0年前我写答案时还不存在。
德克·埃德比布特

好像编辑被拒绝了,我或多或少都同意拒绝。答案仍然是正确的,具有其上下文,并且注释对其进行了更新。
德克·埃德比布特

谢谢你 我误会了您需要使用加号来分隔长行。我很高兴现实要简单得多!
伊恩·塞缪尔·麦克莱恩

143

ah,评论太少了。无论如何,@ 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)。所以这也是为什么你更好的使用与溶液paste()paste0()德克建议。


谢谢乔里斯。我看到了一些示例,这些示例与您在某些在线文档中提供的示例相似,并且也对该字符串进行了尝试。我认为,如果没有遇到结束语,它将继续到下一行。但是对于字符串,它不起作用,或者,正如您所说的那样,就某种意义而言,它以回车符作为换行符的方式起作用。
Curious2learn 2011年

感谢您说清楚为什么有时有时可以用加号分割行!
伊恩·塞缪尔·麦克莱恩

8
不,这不比python聪明。而不是paste("~one",\n"/two")只需要("~one" \n "/two")。删除逗号和paste。不看语言打击。我使用这两种语言,但是粘贴总是令人讨厌。
Phil Cooper

2
@JorisMeys对,我正在尝试纠正该错误陈述。使用括号,您不需要“ \”来继续行。我喜欢它,因为您还可以("one"\n "/one.one" # some comment\n "/two")'
Phil Cooper

1
leaving a bracket open, or ending the line with an operator这两个是要走的路。
SIslam

35

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

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

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

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

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

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


3
我最喜欢这个答案,因为如果字符串很长,则不必像粘贴一样写很多逗号。+1
user3032689

3
请注意,strwrap即使源字符串不超过10k个字符,也可能返回多个字符串的向量。尝试strwrap("a\n\nb")。它将返回长度为3的向量,您需要paste(strwrap("a\n\nb"), collapse=" ")使用空格字符胶将其粘贴回去以折叠向量。
Gedrox

17

对于这种特殊情况,有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]

可能是您混淆了要尝试回答的问题?这与OP的问题无关。
策尔克

确实有。主要问题是如何将一行代码分成几行。我通过使用另一个比原始问题复杂得多的示例进行了演示。我认为有必要发布它,因为我花了很多时间试图弄清楚如何拆分特定的代码。而且我想它可以帮助遇到类似问题的人。
M Terry

OP的问题是,用换行符分割字符向量时,字符向量中包含了换行符。您的答案仅特定于data.table语法
zerweck

作为将代码行拆分为多行的示例
M Terry,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.