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。美好的