假设我有很多顺序函数。每个函数的结果用于序列中的下一个函数。
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_e
和fun_f
。
R是否具有此类编程的某些功能?
如果你知道如何从计算机科学家的角度来看这个概念,那么奖励积分。
答案 0 :(得分: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)"