我需要构建许多具有不同参数的函数,尽管它们共享大量代码和结构。
为了避免重复,我想聪明地构建一个函数工厂(也称为闭包)。
我无法弄清如何在函数工厂内传递函数参数。
我的用例是一堆S3构造函数,它们都共享相同的验证机制。因此,我将使用它作为示例来说明我的问题。
例如,我有一个
显然,我希望避免构造函数通用部分的重复,因此一个可以像这样使用的函数工厂将很不错:
然而,这样做是行不通的,因为生成的构造函数只有一个
有没有办法解决这个问题? 我做错了什么吗?
(对我来说,生成的类构造函数具有正确命名的参数非常重要,所以
我的用例是一堆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)
}
显然,我希望避免构造函数通用部分的重复,因此一个可以像这样使用的函数工厂将很不错:
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
参数。有没有办法解决这个问题? 我做错了什么吗?
(对我来说,生成的类构造函数具有正确命名的参数非常重要,所以
...
方法行不通。)