Какая разница в использовании точки с запятой или явной новой строки в коде R

Первоначально я думал, что точка с запятой ; эквивалентна добавлению явной новой строки, например.

x <- 1; y <- 2

совпадает с

x <- 1
x <- 2

Конечно, R-документация, похоже, не делает различий в отношении синтаксически полных утверждений:

Обе точки с запятой и новые строки могут использоваться для разделения операторов. точка с запятой всегда указывает конец инструкции, в то время как новая строка может укажите конец заявления. Если текущее выражение не синтаксически завершенные новые строки просто игнорируются оценщиком.

Однако я обнаружил, что по крайней мере в Rstudio Server точка с запятой ведет себя по-разному к новой строке. Например:

> 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

Почему это происходит? Есть ли какие-либо другие ошибки, которые я должен искать?

Ответы

Ответ 1

На консоли script оценивается, как только строка a заканчивается полным оператором. Следовательно, это:

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
}