R 智能需求搜索

R 智能需求搜索,r,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) 我想做的是让一些动态的东西能够理解当我传递它“d”时,例如,它应该运行fun\u e和fun\u f 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)
我想做的是让一些动态的东西能够理解当我传递它“d”时,例如,它应该运行
fun\u e
fun\u f

R对于这种类型的编程有一些功能吗


如果你知道如何从计算机科学家的角度来引用这个概念,你会得到额外的分数

不能通过对象名(至少以自然的方式)改变函数的行为。 但是您可以基于对象类指定函数行为。 这是一个称为函数重载的概念。 我认为这接近你想要做的

在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)"

MyFunc不能通过对象名(至少以自然方式)改变函数的行为。
但是您可以基于对象类指定函数行为。
这是一个称为函数重载的概念。
我认为这接近你想要做的

在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)"

MyFunc您可能正在寻找的是一种
make
()吗?能否提供一个更具体的示例,说明如何识别不同的顺序对象?除了KotaMori的“class”es示例之外,您还可以根据一些“attr”属性或参数的可能值(例如通过
match.arg
)使用一个简单的
开关
?@JanvanderLaan是的,这正是我要寻找的。基于规则的系统可以很好地工作。谢谢你。@alexis_laz现在还没有规定。我没有构建任何东西,我在问是否存在一些东西。也许你在寻找一种
make
()?你能提供一个更具体的例子,说明如何识别不同的顺序对象吗?除了KotaMori的“class”es示例之外,您还可以根据一些“attr”属性或参数的可能值(例如通过
match.arg
)使用一个简单的
开关
?@JanvanderLaan是的,这正是我要寻找的。基于规则的系统可以很好地工作。谢谢你。@alexis_laz现在还没有规定。我没有构建任何东西,我在问是否存在一些东西。我甚至没有想过使用s3。很好,我甚至没想过用s3。美好的