ChatGPT解决这个技术问题 Extra ChatGPT

在 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 键;但这不起作用。

谢谢。


C
Claus Wilke

呸,评论太少了。无论如何,@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)。所以这也是为什么您最好使用 Dirk 提出的 paste()paste0() 的解决方案。


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

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

对于您的问题,请尝试

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 还不存在。
看起来编辑被拒绝了,我或多或少同意拒绝。答案仍然是正确的,有它的上下文和评论更新它。
谢谢你。我误会了您需要使用加号来拆分长行。我很高兴现实要简单得多!
A
Andrew

上面 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
请注意,即使源字符串不超过 10k 个字符,strwrap 也可能返回多个字符串的向量。试试 strwrap("a\n\nb")。它将返回长度为 3 的向量,您需要使用 paste(strwrap("a\n\nb"), collapse=" ") 使用空格字符胶将其粘贴回来以折叠向量。
有人可以编辑答案以包含先前评论中的重要信息吗?我不太了解这个问题,也不想弄乱答案。
我不明白“保留空白/结构的重要性”在这里是什么意思。这是否意味着保留在代码中或字符对象本身中?此外,生成的字符向量肯定有空格。我理解这个答案是关于如何用空格替换换行符,然后将每个空格的情况折叠为一个空格(除了保留一些标点符号后的双空格)。
G
G. Grothendieck

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

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

r
randy

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

glue("some\\
     thing")

something

M
M Terry

我知道这篇文章很旧,但是我遇到了这样的情况,只想分享我的解决方案。上面的所有答案都很好。但是,如果您有一个代码,例如 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的问题无关。
它确实有。主要问题是如何将一行代码分成几行。我通过使用另一个比原始问题更复杂的示例来证明这一点。我认为有必要发布它,因为我花了很多时间试图弄清楚如何拆分那段特定的代码。我想它可以帮助有类似问题的人。
OP的问题是用换行符分割字符向量包括字符向量中的换行符。您的答案仅特定于 data.table 语法
作为将一行代码拆分为多行的示例
这个答案在问题的范围内,因为问题不清楚。有些人知道跨多行编写单行字符串是一种特殊情况,应该与通常如何拆分代码行分开提出一个问题,但许多会看到这个问题的人并不知道这一点。理想情况下,会有两个不同的问题,每个问题都包含一个链接,但这里已经有两个问题的答案。
K
Kyouma

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

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

括号在做什么?我没有发现包含或省略它们的任何效果。这似乎也没有回答这个问题,即如何在脚本的多行上编写单行字符串。
F
Feng Jiang

没有 coinvent 方法可以做到这一点,因为 R 中没有运算符来进行字符串连接。

但是,您可以定义一个 R 中缀运算符来进行字符串连接:

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

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

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

这会给你“abc”。