递归函数和全局变量与局部变量



我正在用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

您可以使用local函数做同样的事情,但不修改全局环境:

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

这非常整齐地将testfun函数包装在保存i本地环境中。在提交的包CRAN中,这种方法应该是可以接受的,而修改全局环境则不行。

好吧,我不是很聪明。下面是答案:

i <<- i + 1

给出"i"作为函数的参数。

相关内容

  • 没有找到相关文章

最新更新