Проблема определения объема при назначении функций в цикле - PullRequest
0 голосов
/ 06 декабря 2018

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

for(i in 1:3){
  for(j in 1:2){
    temp_fun <- function(x){
      (x+i)^j
      }
    assign(paste0("fun", paste0("_plus_", i, "_pow_", j)), temp_fun)
  }
}

Этот цикл создает 6 функций, которые имеют x только в качестве зависимой переменной

fun_plus_1_pow_1
fun_plus_1_pow_2
fun_plus_2_pow_1
fun_plus_2_pow_2
fun_plus_3_pow_1
fun_plus_3_pow_2

Например, fun_plus_2_pow_1(2) должно возвращать (2+2)^1 = 4,однако он возвращает 25.Я знаю, что здесь происходит, значения i и j обновляются во время работы цикла, и в конечном итоге i=3 и j=2 принимаются, в результате чего (2+3)^2 = 25.

Но как я могу сделать их локальными?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Зачем вам это нужно?Было бы достаточно просто определить одну функцию fun(x, i, j), а затем использовать частичное применение:

library(pryr)
fun <- function(x, i, j) (x + i)^j

partial(fun, i = 2, j = 1)(2) 
## [1] 4

# an example of passing partial(...) as a function to another function, i.e. to sapply
sapply(1:10, partial(fun, i = 2, j = 1))
## [1]  3  4  5  6  7  8  9 10 11 12

Обратите внимание, что partial(fun, i = i, j = j) для определенных значений i и j является функцией xодин.

0 голосов
/ 06 декабря 2018

Вот один из вариантов.Я также изменил этот материал assign (создание группы систематически именованных объектов в глобальной среде является явным признаком использования списка).

funs <- matrix(list(), 3, 2, dimnames = list(paste0("plus", 1:3), 
                                             paste0("pow", 1:2)))

for(i in 1:3){
  for(j in 1:2){
    create_fun <- function(i, j){
      #force evaluation so that the values are stored in the closure
      force(i); force(j) 
      function(x) (x+i)^j
    }
    funs[i, j][[1]] <- create_fun(i, j)
  }
}

funs["plus2", "pow1"][[1]](2)
#[1] 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...