首先,考虑以下计算函数被调用次数的Python代码:
def counter(fn):
count = 0
def inner(*args, **kwargs):
nonlocal count
count +=1
print('Function {0} was called {1} times'.format(fn.__name__, count))
return fn(*args, **kwargs)
return inner
def add(a,b):
return a+b
def mult(a,b):
return a*b
add = counter(add)
mult = counter(mult)
add(1,2)
add(2,3)
mult(1,5)
#output
Function add was called 1 times
Function add was called 2 times
Function mult was called 1 times
现在,我正try 在R中执行相同的方法,如下所示:
counter <- function(fn) {
cnt <- 0
inner <- function(...) {
cnt <<- cnt + 1
print(paste("Function", match.call(), "was called", cnt, "times\n"))
return(fn(...))
}
return(inner)
}
add <- function(a, b) a + b
mult <- function(a, b) a*b
cnt_add <- counter(add)
cnt_add(1, 4)
cnt_add(3, 9)
[1] "Function cnt_add was called 1 times\n"
[2] "Function 1 was called 1 times\n" #<---- !!!!!!!!!!!!!! L1
[3] "Function 4 was called 1 times\n" #<---- !!!!!!!!!!!!!! L2
[1] 5
[1] "Function cnt_add was called 2 times\n"
[2] "Function 3 was called 2 times\n" #<---- !!!!!!!!!!!!!! L3
[3] "Function 9 was called 2 times\n" #<---- !!!!!!!!!!!!!!
[1] 12
cnt_mult<-counter(mult)
cnt_mult(1,6)
[1] "Function cnt_mult was called 1 times\n"
[2] "Function 1 was called 1 times\n" #<---- !!!!!!!!!!!!!! L4
[3] "Function 6 was called 1 times\n" #<---- !!!!!!!!!!!!!! L5
[1] 6
a)我以为"Function?Is Call?Times\n",但为什么打印L1、L2、L3、L4、L5?
当我try 时为b)(就像在Python中一样)
add <- counter(add)
add(3, 4)
我得到一个错误:Error: evaluation nested too deeply....
c)个 为了避免b中的错误,我try 了如下操作,但仍收到错误
cnt_add <- counter(add)
add <- cnt_add
add(6, 8)
我发现,如果我调用cnt_add函数一次,没有发生错误(除了控制台中的另外两行):
cnt_add <- counter(add)
cnt_add(1, 8)
[1] "Function cnt_add was called 1 times\n"
[2] "Function 1 was called 1 times\n"
[3] "Function 8 was called 1 times\n"
[1] 9
add <- cnt_add
add(6, 8)
[1] "Function add was called 2 times\n" "Function 6 was called 2 times\n"
[3] "Function 8 was called 2 times\n"
[1] 14
但是为什么"函数加被调用了2次",我就调用了一次!为什么它至少需要一次通话才能正常工作?
如何解决这些问题?我不想要其他方法,因为这只是闭包中的一种做法.