呸,评论太少了。无论如何,@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()
的解决方案。
您不是在多行上破坏代码,而是在单个标识符上。它们是有区别的。
对于您的问题,请尝试
R> setwd(paste("~/a/very/long/path/here",
"/and/then/some/more",
"/and/then/some/more",
"/and/then/some/more", sep=""))
这也说明了跨多行中断代码是完全可以的。
paste0
还不存在。
上面 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 将您的文本包装成一个非常非常长的行,您将获得一个没有空格/换行符的单个字符向量。
strwrap
也可能返回多个字符串的向量。试试 strwrap("a\n\nb")
。它将返回长度为 3 的向量,您需要使用 paste(strwrap("a\n\nb"), collapse=" ")
使用空格字符胶将其粘贴回来以折叠向量。
对于这种特殊情况,有 file.path
:
File <- file.path("~",
"a",
"very",
"long",
"path",
"here",
"that",
"goes",
"beyond",
"80",
"characters",
"and",
"then",
"some",
"more")
setwd(File)
glue::glue
函数可以提供帮助。您可以在脚本的多行中编写一个字符串,但通过以 \\
结束每一行来从字符串对象中删除换行符:
glue("some\\
thing")
something
我知道这篇文章很旧,但是我遇到了这样的情况,只想分享我的解决方案。上面的所有答案都很好。但是,如果您有一个代码,例如 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
")
没有 coinvent 方法可以做到这一点,因为 R 中没有运算符来进行字符串连接。
但是,您可以定义一个 R 中缀运算符来进行字符串连接:
`%+%` = function(x,y) return(paste0(x,y))
然后你可以用它来连接字符串,甚至将代码分成多行:
s = "a" %+%
"b" %+%
"c"
这会给你“abc”。
paste("~one",\n"/two")
,您只需要("~one" \n "/two")
。删除逗号和paste
。不看语言smackdown。我使用这两种语言,但总是觉得粘贴很烦人。("one"\n "/one.one" # some comment\n "/two")'
示例leaving a bracket open, or ending the line with an operator
这两个是要走的路。