I am having trouble understanding why R has two functions below functionGen1
and functionGen2
behave differently. Both functions try to return another function that simply prints the number passed as an argument to the function generator.
In the first case, the generated functions do not work, because they are a
no longer present in the global environment, but I do not understand why this should be. I would think that it was passed as an argument and replaced with aNumber
in the namespace of the generator function and print function. A.
My question is: why the functions in the list list.of.functions1
no longer work if a
not defined in the global environment? (And why does this work for the occasion list.of.functions2
and even list.of.functions1b
)?
functionGen1 <- function(aNumber) {
printNumber <- function() {
print(aNumber)
}
return(printNumber)
}
functionGen2 <- function(aNumber) {
thisNumber <- aNumber
printNumber <- function() {
print(thisNumber)
}
return(printNumber)
}
list.of.functions1 <- list.of.functions2 <- list()
for (a in 1:2) {
list.of.functions1[[a]] <- functionGen1(a)
list.of.functions2[[a]] <- functionGen2(a)
}
rm(a)
list.of.functions1[[1]]()
list.of.functions2[[1]]()
list.of.functions2[[2]]()
list.of.functions1b <- lapply(c(1:2), functionGen1)