Относительно 1 и 2):
Это связано с порядком оценки. Ваш код был:
adder2 <- function() {x <- 0; function() {x <<- x+1; x}}()
Здесь сначала выполняется выражение R {x <- 0; function() {x <<- x+1; x}}
. Возможно, вы знаете, что значение выражения в R является последним значением в выражении. Таким образом, в этом случае выражение оценивается как анонимная функция (которая живет в среде, в которой было определено x <- 0
):
> {x <- 0; function() {x <<- x+1; x}}
function() {x <<- x+1; x}
На следующем шаге вызывается эта промежуточная функция (а не вся эта вещь, как вы ожидали!). Результатом этого промежуточного кода является, конечно, 1. Таким образом, остается только:
adder2 <- function() 1
Это объясняет поведение, а также почему оно работает с круглыми скобками, как отмечено в комментариях.
Относительно 3):
Вы ищете функцию local
:
> adder2 <- local({x <- 0; function() {x <<- x+1; x}})
> adder2()
[1] 1
> adder2()
[1] 2