R Lazy Evaluation - не работает - PullRequest
0 голосов
/ 30 мая 2018

Я играл с примерами Advanced R http://adv -r.had.co.nz / Functions.html и получил разные результаты.Согласно книге, ленивая оценка по умолчанию.Но мне кажется, что он выключен.Почему это так и как это решить?

Что я получил:

add <- function(x) {
    function(y) x+y
}
adders <- lapply(1:10, add)
adders[[1]](10)
[1] 11    **The book gave 20 instead of 11**
adders[[10]](10)
[1] 20

1 Ответ

0 голосов
/ 30 мая 2018

В 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
...