Я хотел бы создать функцию "compose" в R, которая будет составлять произвольное количество функций, заданных в качестве аргументов.
До сих пор я достиг этого, определяя функцию "из", которая состоит из двух аргументов, а затем Сокращение:
of <- function(f,g) function(x) f(g(x))
id <- function(x) x
compose <- function(...) {
argms = c(...)
Reduce(of,argms,id)
}
Кажется, что это работает нормально, но поскольку я изучаю R, я думал, что попытаюсь записать его в явном рекурсивном стиле, то есть отказаться от использования Reduce, то, что вы делаете в Scheme следующим образом:
(define (compose . args)
(if (null? args) identity
((car args) (apply compose (cdr args)))))
Я столкнулся с целым рядом препятствий, по-видимому, главный момент в настоящий момент состоит в том, что первый элемент аргументов не распознается как функция. Моя слабая попытка:
comp <- function(...) {
argms <- list(...)
len <- length(argms)
if(len==0) { return(id) }
else {
(argms[1])(do.call(comp,argms[2:len]))
}
}
Выплескивает: Error in comp(sin, cos, tan): attempt to apply non-function
Должен быть какой-то способ сделать это, что ускользает от меня. Какие-либо предложения?