获取当前调用的函数来编写匿名递归函数

时间:2013-10-31 18:35:21

标签: r

如何在函数中获取递归应用的当前函数?这是一个简单的例子:

myfun <- function(x) {
  if(is.list(x)){
    lapply(x, myfun)
  } else {
    length(x)
  }
}

我想让它匿名,但我不知道如何告诉lapply在没有名字的情况下使用当前函数。我尝试了Recall,但这不起作用:

(function(x) {
  if(is.list(x)){
    lapply(x, Recall)
  } else {
    length(x)
  }
})(cars)

同样match.call()[[1]]对匿名函数没有帮助。

2 个答案:

答案 0 :(得分:4)

例如,sys.function(0)以递归方式计算列表的平方:

(function(x) {
  if(length(x)>2){
    lapply(x,sys.function(0))
  } else {
    x^2
  }
})(list(1,2,3))

 [[1]]
[1] 1

[[2]]
[1] 4

[[3]]
[1] 9

答案 1 :(得分:1)

我认为您正在寻找的是sys.function

> (function() print(sys.function(1)))()
function() print(sys.function(1))

Recall实际上说:

  

local用于编写匿名递归函数的另一种方法。

我们的想法是您在本地定义名称:

local(myfun <- function(...) { ... myfun(...) ... })

并且没有在外面定义。

相关问题