Я хотел бы создать функцию "compose" в R, которая будет составлять произвольное количество функций, заданных в качестве аргументов.
До сих пор я достигал этого путем определения функции "of", которая составляетдва аргумента, а затем уменьшаем это:
of <- function(f,g) function(x) f(g(x))
id <- function(x) x
compose <- function(...) {
argms = c(...)
Reduce(of,argms,id)
}
Кажется, это работает нормально, но так как я изучаю R, я подумал, что попытаюсь написать его в явном рекурсивном стиле, то есть отказаться от использованияСократим, например, то, что вы бы делали в Схеме, вот так:
(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
Должен быть какой-то способ сделать это, что ускользает от меня.Есть предложения?