Уменьшить точечное добавление функции Stacksize - PullRequest
0 голосов
/ 06 февраля 2019

Мне нужно поточечно добавить некоторые функции (для домашней работы), я мог бы сделать это вручную, но, как большой поклонник функционального программирования, я хочу набрать несколько стилевых баллов.Размер стека и максимальная глубина рекурсии портят удовольствие.

Есть ли у кого-нибудь предложения о том, как реализовать это более эффективно?(Или я где-то ошибся?)

require(purrr)

A <- function(x) x+2
B <- function(y) y^2
C <- function(z) z*3

add_funs <- function(...){
  reduce(list(...), function(a,b){
    function(x){
      a(x)+b(x)
    }
  })
}

test <- add_funs(A,B,C)
test(2)

# Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
# Error during wrapup: evaluation nested too deeply: infinite recursion / options(expressions=)?

test2 <- add_funs(A,B)
test2(2)

# Error: C stack usage  7969380 is too close to the limit

1 Ответ

0 голосов
/ 06 февраля 2019

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

add_funs_2 <- function(...){
  function(x){
    reduce(map(list(...), function(a){a(x)}), `+`)
  }
}

test3 <- add_funs_2(A,B,C)
test3(2)
# 14
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...