我原本以为分号;
相当于添加一个明确的新行,例如。
x <- 1; y <- 2
与
相同x <- 1
x <- 2
当然R documentation似乎没有区别于语法上完整的陈述:
分号和新行都可用于分隔语句。一个 分号始终表示语句的结尾,而新行可以 表明声明的结束。如果当前的陈述不是 语法上完成的新行只会被评估者忽略。
但是,我发现至少在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
与
相比> temp_a
Error: object 'temp_a' not found
> temp_b <- 1
> temp_c <- 2
>
> exists("temp_b")
[1] TRUE
> exists("temp_c")
[1] TRUE
为什么会这样?还有其他问题需要注意吗?
答案 0 :(得分:28)
在控制台上,只要一行以完整语句结束,就会评估脚本。因此,这个:
temp_a
temp_b <- 1
temp_c <- 2
对此称之为:
source(textConnection('temp_a'))
source(textConnection('temp_b <- 1'))
source(textConnection('temp_c <- 2'))
其中每一行在遇到时都会被评估,并且失败 在之前的行中,不要阻止后续行的计算。 另一方面。这样:
temp_a ; temp_b <- 1 ; temp_c <- 2
相当于调用它:
source(textConnection('temp_a ; temp_b <- 1 ; temp_c <- 2'))
等同于此
source(textConnection('
temp_a
temp_b <- 1
temp_c <- 2'))
因为当第一行失败时,代码的其余部分不会运行。
顺便说一句,如果您想在控制台模仿此行为,则可以 利用这些事实,直到他们做出评估线 一个完整的陈述,用括号围绕三条线来制作一个 单个代码块,作为一个整体进行评估,如下所示:
{
temp_a
temp_b <- 1
temp_c <- 2
}