Andrzej
Andrzej

Reputation: 3

Putting user-defined on a list in for loop

I have problems storing user defined functions in R list when they are put on it in a for loop.

I have to define some segment-specific functions based on some parameters, so I create functions and put them on a list looping through segments with for-loop. The problem is I get same function everywhere on a result list.

The code looks like this:

n <- 100
segmenty <- 1:n
segment_functions <- list()
for (i in segmenty){
   segment_functions[[i]] <- function(){return(i)}
}

When i run the code what I get is the same function (last created in the loop) for all indexes:

## for all k
segment_functions[[k]]()
[1] 100 

There is no problem when I put the functions on list manually e.g.

   segment_functions[[1]] <- function(){return(1)}
   segment_functions[[2]] <- function(){return(2)}
   segment_functions[[3]] <- function(){return(3)}

works just fine.

I honsetly have no idea what's wrong. Could you help?

Upvotes: 0

Views: 49

Answers (2)

gcons
gcons

Reputation: 431

You need to use the force function to ensure that the evaluation of i is done during the assignment into the list:

n <- 100
segmenty <- 1:n
segment_functions <- list()

f <- function(i) { force(i); function() return(i) }

for (i in segmenty){
  segment_functions[[i]] <- f(i)
}

Upvotes: 2

Alper t. Turker
Alper t. Turker

Reputation: 35219

I'd use lapply and capture i in a clousre of the wrapper:

segment_functions <- lapply(1:100, function(i) function() i)

Upvotes: 1

Related Questions