在R代码中使用分号或显式新行有什么区别

Ale*_*lex 31 r

我原本以为分号;相当于添加一个明确的新行,例如

x <- 1; y <- 2
Run Code Online (Sandbox Code Playgroud)

是相同的

x <- 1
x <- 2
Run Code Online (Sandbox Code Playgroud)

当然,R文档似乎没有区别于语法上完整的语句:

分号和新行都可用于分隔语句.分号始终表示语句的结尾,而新行可以表示语句的结束.如果当前语句在语法上不完整,则评估者将忽略新行.

但是,我发现至少在Rstudio服务器中,分号的行为与新行不同.例如:

> temp_a ; temp_b <- 1 ; temp_c <- 2
Error: object 'temp_a' not found
> exists("temp_b")
[1] FALSE
> exists("temp_c")
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

相比

> temp_a
Error: object 'temp_a' not found
> temp_b <- 1
> temp_c <- 2
> 
> exists("temp_b")
[1] TRUE
> exists("temp_c")
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

为什么会这样?还有其他问题我应该留意吗?

Jth*_*rpe 30

在控制台上,只要一行以完整语句结束,就会评估脚本.因此,这:

temp_a 
temp_b <- 1 
temp_c <- 2
Run Code Online (Sandbox Code Playgroud)

称之为:

source(textConnection('temp_a'))
source(textConnection('temp_b <- 1'))
source(textConnection('temp_c <- 2'))
Run Code Online (Sandbox Code Playgroud)

其中每一行在遇到时都会被评估,前一行中的失败不会阻止后续行的计算.另一方面.这个:

temp_a ; temp_b <- 1 ; temp_c <- 2
Run Code Online (Sandbox Code Playgroud)

相当于调用这个:

source(textConnection('temp_a ; temp_b <- 1 ; temp_c <- 2'))
Run Code Online (Sandbox Code Playgroud)

相当于本

source(textConnection('
temp_a  
temp_b <- 1 
temp_c <- 2'))
Run Code Online (Sandbox Code Playgroud)

因为当第一行失败时,代码的其余部分不会运行.

顺便提一下,如果你想在控制台上模仿这种行为,你可以利用这样一个事实:直到它们完成一个完整的语句才会评估这些行,通过用括号括起三行来制作一个被评估为的单个代码块.整体,像这样:

{
    temp_a 
    temp_b <- 1 
    temp_c <- 2
}
Run Code Online (Sandbox Code Playgroud)