我需要构建许多带有许多不同参数的函数,尽管它们共享许多代码和结构。
为了避免重复,我想我应该聪明地为自己构建一个函数工厂(又名闭包)。
我不知道如何在函数工厂内传递函数参数.
我的用例是一堆 S3 构造函数,所有这些函数都共享相同的验证机制。
所以我将以此为例来解释我的问题。
说吧,我有一个ClassA
and 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
, and A_arg2
.
有办法做到这一点吗?
我这样做错了吗?
(对我来说非常重要的是生成的类构造函数具有正确命名的参数,因此...
方法行不通)。