Как составить список функций - PullRequest
0 голосов
/ 23 октября 2018

Например, у меня есть вектор функций: fun_vec <- c(step1,step2,step3).Теперь я хочу составить их так: step1(step2(step3(x))).Как мне сделать это, используя fun_vec?(Предположим, что fun_vec не является фиксированным и может иметь больше или меньше функций.)

Ответы [ 4 ]

0 голосов
/ 23 октября 2018

Вот базовый рекурсивный подход R:

compose <- function(funs) {
  n <- length(funs)
  fcomp <- function(x) funs[[n - 1]](funs[[n]](x))
  ifelse(n > 2, compose(c(funs[1:(n - 2)], fcomp)), fcomp)
}

x <- c(sqrt, log, exp)
compose(x)(2)
# [1] 1.414214
sqrt(log(exp(2)))
# [1] 1.414214

Если число функций в funs больше двух, мы сокращаем список на одну, заменяя последние две функции их композицией.В противном случае мы возвращаем композицию последних двух оставшихся.Предполагается, что изначально в funs.

есть как минимум две функции.
0 голосов
/ 23 октября 2018

Вы можете использовать freduce из пакета magrittr:

fun_vec = c(function(x) x^2, function(x) sum(x), function(x) sqrt(x))

library(magrittr)    
freduce(1:10, fun_vec)

Альтернативно, определите последовательность функций с трубами, например ...

library(magrittr)    
f = . %>% raise_to_power(2) %>% sum %>% sqrt

f(1:10)

Аналогичный пример: Isесть ли способ "пролистать список"?

0 голосов
/ 23 октября 2018

Подобно тому, как Фрэнк использовал freduce, вы можете использовать Reduce:

step1 <- function(a) a^2
step2 <- function(a) sum(a)
step3 <- function(a) sqrt(a)
steps <- list(step1, step2, step3)
Reduce(function(a,f) f(a), steps, 1:3)
# [1] 3.741657
step3(step2(step1(1:3)))
# [1] 3.741657

Вы можете увидеть его "в действии" с:

Reduce(function(a,f) f(a), steps, 1:3, accumulate=TRUE)
# [[1]]
# [1] 1 2 3
# [[2]]
# [1] 1 4 9
# [[3]]
# [1] 14
# [[4]]
# [1] 3.741657
0 голосов
/ 23 октября 2018

Взгляните на purrr::compose.Если ваши функции хранятся в списке, используйте purrr::invoke, чтобы передать этот список в compose:

fun_vec <- c( exp, log10, sqrt )
f <- purrr::invoke( purrr::compose, fun_vec )
f(4)                      # 1.35125
exp( log10( sqrt(4) ) )   # 1.35125
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...