"R передает promises, а не значения. Обещание принудительно, когда оно сначала оценивается, а не когда оно передается.", см. этот ответ Г. Гротендика. Также см. этот вопрос, ссылаясь на книгу Хэдли.
В простых примерах, таких как
> funs <- lapply(1:10, function(i) function() print(i))
> funs[[1]]()
[1] 10
> funs[[2]]()
[1] 10
можно учитывать такое неинтуитивное поведение.
Однако я часто попадаю в эту ловушку во время ежедневного развития. Я следую довольно функциональному стилю программирования, а это значит, что у меня часто есть функция A, возвращающая функцию B, где B находится в некотором роде в зависимости от параметров, с которыми был вызван A. Зависимость не так проста, как в приведенном выше примере, поскольку вычисления сложны и есть несколько параметров.
Рассмотрение такой проблемы приводит к трудным для отладки проблем, поскольку все вычисления выполняются бесперебойно - за исключением того, что результат неверен. Только явная проверка результатов выявляет проблему.
Что происходит сверху, так это то, что даже если бы я заметил такую проблему, я никогда не был уверен, какие переменные мне нужны для force
, а у меня нет.
Как я могу не попасть в эту ловушку? Существуют ли какие-либо шаблоны программирования, которые препятствуют тому или иному, по крайней мере, убедиться, что я заметил, что есть проблема?