Я не уверен, что делают promises в R
Если вы запустите
a = lapply(seq_len(2), function(n) { function() {n}})
b = lapply(seq_len(2), function(n) {n})
мы можем видеть, что
a[[1]]() # == 2
b[[1]] # == 1
Я понимаю, что R использует объект обещания и лениво оценивает выражение в своей среде, но я не понимаю, почему разные среды, созданный для каждой функции, не будет содержать их собственного значения для n.
[[1]]
function ()
{
n
}
<environment: 0x7f9b2416ad18>
[[2]]
function ()
{
n
}
<environment: 0x7f9b2416ab20>
as.list(environment(a[[1]]))
$n
[1] 2
as.list(environment(a[[2]]))
$n
[1] 2
Можно ли как-то зафиксировать семантику через функцию lapply?
lapply
function (X, FUN, ...)
{
FUN <- match.fun(FUN)
if (!is.vector(X) || is.object(X))
X <- as.list(X)
.Internal(lapply(X, FUN))
}
<bytecode: 0x7f9b25150f18>
<environment: namespace:base>
PS: вопрос с обратной фокусировкой
Изменить: можно ли написать функцию lapply2, которая в общем случае "заставляет" аргумент иметь единообразное поведение, как в:
pl <- lapply (1:3, function(y) { force(y); function(x) pow(x,y) } )
pl <- lapply2(1:3, function(y) { function(x) pow(x,y) } )