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

Cur*_*arn 130 r multiline

我想在多个行中分割R脚本中的一行(因为它太长了).我怎么做?

具体来说,我有一条线,如

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

是否有可能将长路径分成多条线?我试过了

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

return键在第一行的末尾; 但这不起作用.

谢谢.

Jor*_*eys 136

呸,评论太小了.无论如何,@ Dirk是对的.

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

请注意,您必须确保您的代码没有完成.相比

a <- 1 + 2
+ 3
Run Code Online (Sandbox Code Playgroud)

a <- 1 + 2 +
3
Run Code Online (Sandbox Code Playgroud)

因此,当在多行上传播代码时,您必须确保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.
Run Code Online (Sandbox Code Playgroud)

这就是为什么在这种情况下,您的代码不起作用的原因:路径不能包含换行符(\n).所以这也是为什么你更好地使用该解决方案具有paste()paste0()德克建议.

  • 不,这里并不比python聪明.而不是`paste("〜one",\n"/ two")`你只需要`("〜one"\n"/ two")`.删除逗号和"粘贴".不看语言咂嘴.我使用这两种语言,但总是粘贴是一种烦恼. (7认同)
  • @JorisMeys对,我正在尝试纠正该错误陈述。使用括号,您不需要“ \”来继续行。我喜欢它,因为您还可以在行中添加注释,而这些注释是您无法使用“ \”语法完成的(例如“(“ one” \ n“ /one.one”#一些注释\ n“ / two”)' http://stackoverflow.com/questions/10660435/pythonic-way-to-create-a-long-multi-line-string (2认同)

Dir*_*tel 101

您不是在多行上破坏代码,而是在单个标识符上.它们是有区别的.

对于您的问题,请尝试

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

这也说明在多行中破解代码是完全正确的.

  • 但是,当我2年前写下答案时,`paste0`还不存在. (28认同)
  • 谢谢!我想知道是否有一个字符可以放在行尾以表示R代码在下一行继续.比如Python中的"\".但是,您的解决方案适用于字符串延续的特定问题. (12认同)
  • 或者你最好使用paste0(...),相当于paste(...,sep ="") (12认同)

And*_*rew 31

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

1)将文本字符串放在多行中

long_string <- "this
is 
a 
long
string
with
whitespace"
Run Code Online (Sandbox Code Playgroud)

2)R将引入一堆\n字符.strwrap()根据文档删除那些破坏空白的东西:

strwrap(long_string, width=10000, simplify=TRUE)
Run Code Online (Sandbox Code Playgroud)

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

  • 我最喜欢这个答案,因为如果字符串相当长,我不必像粘贴那样写逗号.+1 (3认同)
  • 请注意,即使源字符串不超过10k个字符,`strwrap`也可能返回多个字符串的向量.试试`strwrap("\n \n \nb")`.它将返回长度为3的向量,你需要使用`paste(strwrap("a \n \n \nb"),collapse ="")将其粘贴回来.使用空格字符胶水来折叠向量. (2认同)

G. *_*eck 14

对于那个特例,有file.path:

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


Álv*_*aro 10

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

glue("some\\
     thing")

something
Run Code Online (Sandbox Code Playgroud)


M T*_*rry 8

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

\n\n

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]]][时间_[秒]<=12000]

\n\n

我尝试了上面的大部分建议,但它们没有\xc2\xb4t 工作。但我发现它们可以在 内的逗号后分开[]。在 \xc2\xb4 处分割][不起作用。

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

  • 确实有。主要问题是如何将一行代码分成几行。我通过使用另一个比原来的问题更复杂的例子来证明这一点。我认为有必要发布它,因为我花了很多时间试图弄清楚如何拆分该特定代码段。我想它可以帮助有类似问题的人。 (2认同)