2016-07-31 116 views
0

假設我有很多順序功能。每個函數的結果用於序列中的下一個函數。智能需求搜索

start <- "somevar" 
a <- fun_a(start) 
b <- fun_b(a) 
c <- fun_c(b) 
d <- fun_d(c) 
e <- fun_e(d) 
f <- fun_f(e) 

另一種方式來看待這個會是這樣的:

start %>% fun_a %>% fun_b %>% fun_c %>% fun_d %>% fun_e %>% fun_f 

我希望做的是有一些動態的,當我將它傳遞「d」例如,理解,它應該運行fun_efun_f

R是否有這種類型的編程功能?

如果你知道如何從計算機科學家的角度來引用這個概念,獎勵點。

+0

也許你正在尋找[這](https://github.com/rbertolusso/intubate) – user2100721

+0

您是否在尋找一種'make'(http://matt.might.net/articles /介紹到化妝/)? –

+0

你能否提供一個更具體的例子來說明如何識別不同的順序對象?除了KotaMori用「class」es的例子之外,你還可以根據某些「attr」ibute或參數的可能值(通過例如'match.arg')使用一個簡單的'switch'? –

回答

2

您不能通過對象名稱(至少以自然方式)更改函數的行爲。 但是你可以基於對象類來指定函數行爲。 這是一個稱爲函數重載的概念。 我認爲這接近你想要做的事情。

在R中,可以通過泛型函數實現此功能(請參閱Hadley's Advanced R)。

這是一個簡單的例子。 MuFunc的行爲會根據傳遞的對象所屬的類別進行更改。 它也使用遞歸結構,以便函數調用另一個函數,如您的示例中所示。

MyFunc <- function(x, ...) { 
    UseMethod("MyFunc") 
} 

MyFunc.default <- function(x, ...) { 
    print("running MyFunc.default") 
    class(x) <- c("A", class(x)) 
    MyFunc(x) 
} 

MyFunc.A <- function(x, ...) { 
    print("running MyFunc.A") 
    class(x) <- c("B", class(x)) 
    MyFunc(x) 
} 

MyFunc.B <- function(x, ...) { 
    print("running MyFunc.B") 
    class(x) <- c("C", class(x)) 
    MyFunc(x) 
} 

MyFunc.C <- function(x, ...) { 
    print("running MyFunc.C (Terminal Function)") 
    class(x) <- c("D", class(x)) 
} 

MyFunc(1) 
##[1] "running MyFunc.default" 
##[1] "running MyFunc.A" 
##[1] "running MyFunc.B" 
##[1] "running MyFunc.C (Terminal Function)" 

x <- 1 
class(x) <- "B" 
MyFunc(x) 
##[1] "running MyFunc.B" 
##[1] "running MyFunc.C (Terminal Function)" 
+0

我甚至沒有想過使用s3。尼斯。 –