R: итеративное определение функций внутри функций - PullRequest
0 голосов
/ 27 ноября 2018

Учитывая список функций

functions <- list(f1,f2)

Я хочу итеративно переопределить все функции в этом списке, чтобы получить

newFunctions <- list(function(...){f1(...) + 1},function(...){f2(...) + 1})

Я пытался добиться этого с помощью

newFunctions <- lapply(functions, function(i){
  return(function(...){
    return(i(...) + 1)
    }
}

но это жестко кодирует i в функции вместо функции, на которую указывает итератор.

Я нашел R: определение функций в цикле , где решениезаключается в оценке итератора перед определением функции.Однако я не могу оценить i, так как я перебираю функции

Есть ли способ реализовать это в R?

1 Ответ

0 голосов
/ 27 ноября 2018

Сначала давайте исправим синтаксическую ошибку, избавившись от явных вызовов return:

newFunctions <- lapply(functions, function(x) function(...) x(...) + 1)

Пример использования:

functions <- list(sin, cos, tan)
newFunctions <- lapply(functions, function(x) function(...) x(...) + 1)
identical(
  newFunctions[[1]](1), 
  sin(1) + 1
)
#[1] TRUE

Код создает замыкания.x взято из связанной среды:

newFunctions[[1]]
#function(...) x(...) + 1
#<environment: 0x000000001a812138>
environment(newFunctions[[1]])$x
#function (x)  .Primitive("sin")
...