В R 3.2.0 это изменение было внесено в R:
Функции высшего порядка, такие как функции apply и Reduce (), теперь передают аргументы функциям, которые они применяют, чтобы исключить нежелательные взаимодействия.между ленивой оценкой и переменным захватом в замыканиях.Это разрешает PR # 16093.
Это можно найти в разделе R 3.2.0:
https://cran.r -project.org / doc / manual / / r-devel / NEWS.html
См. также:
https://bugs.r -project.org / bugzilla3 / show_bug.cgi? id = 16093
Демонстрация с использованием версии R до 10.0 * R
Добавление force
к коду в вопросе приведет к тому, что pre-3.2.0 R будет работать так же, как и 3.2.0.
Используя R 3.1.3, мы можем показать разницу, используя force
и не используя force
:
R.version.string
## [1] "R version 3.1.3 Patched (2015-03-16 r68169)"
# adding force to the code in the question
# In R 3.2.0 onwards conceptually R acts as if this R 3.1.3 code were run
add <- function(x) {
force(x) # <---------------------------
function(y) x+y
}
adders <- lapply(1:10, add)
adders[[1]](10)
## [1] 11
# not using force, i.e. using identical code as in the question
add <- function(x) {
function(y) x+y
}
adders <- lapply(1:10, add)
adders[[1]](10)
## [1] 20