我正在R中编写一个递归函数,我希望它能修改一个全局变量,以便我知道调用了多少个函数实例。我不明白为什么以下不起作用:
i <- 1
testfun <- function( depth= 0 ) {
i <- i + 1
cat( sprintf( "i= %d, depth= %d\n", 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
答案 0 :(得分:8)
您可以使用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
函数包装在 local 环境中,该环境包含i
。在提交CRAN的包中,此方法应该是可接受的,而修改全局环境则不是。
答案 1 :(得分:6)
i <<- i + 1
答案 2 :(得分:0)
给我&#34;我&#34;作为功能的论据。