【发布时间】:2017-07-30 10:27:08
【问题描述】:
我需要用很多不同的参数构建很多函数,尽管它们共享很多代码和结构。 为了避免重复,我想我会很聪明,为自己构建一个函数工厂(又名闭包)。
我不知道如何在函数工厂中传递函数参数。
我的用例是一堆 S3 构造函数,它们都共享相同的验证机制。 因此,我将以此为例来解释我的问题。
比如说,我有一个ClassA 和ClassB,每个都需要在各自的构造函数中有自己的参数:
ClassA <- function(A_arg1, A_arg2) {
# some class-SPECIFIC construction magic happens, say
out <- list(A_arg1, A_arg2)
# some GENERAL construction magic happens
class(out) <- "ClassA"
return(out)
}
ClassB <- function(B_arg1, B_arg2) {
# some class-SPECIFIC construction magic happens, say
out <- B_arg1 + B_arg2
# some GENERAL construction magic happens
class(out) <- "ClassB"
return(out)
}
显然,我希望避免在构造函数的 general 部分中出现重复,因此可以像这样使用的函数工厂会很好:
ClassA <- produce_class_constructor(classname = "ClassA", fun = function(A_arg1, A_arg2) {return(list(A_arg1, A_arg2))})
理想情况下,这应该产生与上述手动构造的 ClassA 函数完全相同的函数,但排除了一般部分。
这是我构建该函数工厂的尝试:
produce_class_constructor <- function(classname, fun) {
class_specific_arguments <- formals(fun = fun) # this works just fine on the console
construct_class <- function(class_specific_arguments) {
# here runs the class-specific stuff
out <- fun(class_specific_arguments)
# here runs the general stuff
class(out) <- classname
}
}
但这不起作用,因为生成的构造函数只有一个 class_specific_arguments 参数,而不是实际的 A_arg1 和 A_arg2。
有没有办法做到这一点? 我做错了吗?
(对我来说,生成的类构造函数具有正确命名的参数对我来说非常重要,因此... 方法将不起作用)。
【问题讨论】:
-
我添加了一个类似的问题,我试图弄清楚如何solve the same problem with function operators aka point-free 函数式编程。也许更优雅。
标签: r functional-programming closures factory