2013-10-31 88 views
5

如何獲取遞歸應用函數中的當前函數?下面是一個簡單的例子:獲取當前調用的函數來編寫匿名遞歸函數

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]]不利於匿名函數。

回答

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 
+0

好,但爲什麼你'lapply()'這'X [-1]'而不是'x' ? –

+0

@JoshO'Brien好抓。我用'sys.function(0)(x [-1])'''''''lapply''來測試它... – agstudy

1

你所尋找的是,我認爲,sys.function

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

Recall居然說:

local另一種方式來寫匿名遞歸函數。

的想法是,你定義本地名稱:

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

,它不被外部定義。