在 R 脚本中分割多行代码

我想在一个 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键; 但是这不起作用。

谢谢。

328452 次浏览

您不是在多行上破坏 密码,而是在破坏 一个单一的标识符。这是有区别的。

至于你的问题,试试看

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

这也说明了跨多行破解代码完全没有问题。

呸,评论太少了。不管怎样,“德克说得很对。”。

不需要告诉 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 上面的方法绝对可行,但是如果你正在寻找一种方法来引入一个需要保留空格/结构的长字符串(例如: 一个使用 RODBC 的 SQL 查询) ,有两个步骤的解决方案。

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

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

2) R 将引入一系列 \n字符。根据 文件,用破坏空格的 strwrap()去掉这些空格:

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

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

对于这种特殊情况,存在 file.path:

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

我知道这个帖子很老了,但是我遇到过这样的情况,我只是想分享我的解决方案。以上所有的答案都很好。但是如果使用 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]

这样可以保留 n 个字符,但是你也可以用括号把引号括起来,这在 RMarkdown 中特别有用。

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

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

glue("some\\
thing")


something

因为在 R 中没有操作符来进行字符串串联,所以没有共同发明的方法来实现这一点。

但是,您可以定义一个 R Infix 运算符来执行字符串串联:

`%+%` = function(x,y) return(paste0(x,y))

然后您可以使用它来连接字符串,甚至将代码分成多行:

s = "a" %+%
"b" %+%
"c"

这个会给你“ abc”。

我一直这样做。使用 paste0()函数。

Rootdir = "/myhome/thisproject/part1/"
Subdir = "subdirectory1/subsubdir2/"


fullpath = paste0( Rootdir, Subdir )


fullpath


> fullpath
[1] "/myhome/thisproject/part1/subdirectory1/subsubdir2/"