智能需求搜索

时间:2016-07-31 04:35:40

标签: r

假设我有很多顺序函数。每个函数的结果用于序列中的下一个函数。

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是否具有此类编程的某些功能?

如果你知道如何从计算机科学家的角度来看这个概念,那么

奖励积分。

1 个答案:

答案 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)"