2016-07-31 63 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。尼斯。 –