Рекурсивные функции и глобальные и локальные переменные


Я пишу рекурсивную функцию в R, и я хочу, чтобы она изменила глобальную переменную таким образом, чтобы я знал, сколько экземпляров функции было вызвано. Я не понимаю, почему не работает следующее:

i <- 1

testfun <- function( depth= 0 ) {

  i <- i + 1
  cat( sprintf( "i= %d, depth= %dn", i, depth ) )
  if( depth < 10 ) testfun( depth + 1 )
}

Вот результат:

i= 2, depth= 0
i= 2, depth= 1
i= 2, depth= 2
i= 2, depth= 3
i= 2, depth= 4
i= 2, depth= 5
i= 2, depth= 6
i= 2, depth= 7
i= 2, depth= 8
i= 2, depth= 9
i= 2, depth= 10

Вот ожидаемый результат:

i=2, depth= 0
i=3, depth= 1
i=4, depth= 2
i=5, depth= 3
i=6, depth= 4
i=7, depth= 5
i=8, depth= 6
i=9, depth= 7
i=10, depth= 8
i=11, depth= 9
i=12, depth= 10
3 4

3 ответа:

Вы можете использовать функцию local, чтобы сделать то же самое, но без изменения глобальной среды:

testfun <- local({
  i <- 1
  function( depth= 0 ) {
    i <<- i + 1
    cat( sprintf( "i= %d, depth= %d\n", i, depth ) )
    if( depth < 10 ) testfun( depth + 1 )
  }
})

Это очень аккуратно обертывает функцию testfun в локальную среду, которая содержит i. Этот метод должен быть приемлем в пакетах, представленных CRAN, тогда как изменение глобальной среды-нет.

Ладно, значит, я не очень умный. Вот ответ:

i <<- i + 1

Дайте" i " в качестве аргумента функции.