Странная ошибка jags.parallel / избегать ленивых вычислений при вызове функции

У меня есть вызов функции (для jags.parallel), который работает, когда дан числовой аргумент, такой как n.iter = 100 но терпит неудачу, когда аргумент использует значение переменной, n.iter = n.iter, Похоже, что это может быть ошибка в jags.parallel

Минимальный воспроизводимый пример ошибки:

    library(R2jags)
    model.file <- system.file(package="R2jags", "model", "schools.txt")
    J <- 8.0
    y <- c(28.4,7.9,-2.8,6.8,-0.6,0.6,18.0,12.2)
    sd <- c(14.9,10.2,16.3,11.0,9.4,11.4,10.4,17.6)    
    jags.data <- list("y","sd","J")
    jags.params <- c("mu","sigma","theta")
    jags.inits <- function(){
      list("mu"=rnorm(1),"sigma"=runif(1),"theta"=rnorm(J))
    }

Тогда это работает:

    jagsfit.p <- jags.parallel(data=jags.data, inits=jags.inits, jags.params, 
                               n.iter=5000, model.file=model.file)

Но это не так:

     n.iter=5000
    jagsfit.p <- jags.parallel(data=jags.data, inits=jags.inits, jags.params,
                               n.iter=n.iter, model.file=model.file)

Давать ошибку:

Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
  3 nodes produced errors; first error: object 'n.iter' not found

Я понимаю, что это как-то связано с отсутствием экспорта переменной n.iter в кластер, но не ясно, какой параллельный движок использует jags.parallel. Есть ли способ обмануть R, чтобы оценить n.iter прежде чем передать его в функцию?

1 ответ

Решение

do.call() отличный друг в таких ситуациях, потому что (из ?do.call):

Если "quote" равно "FALSE" по умолчанию, то аргументы оцениваются (в вызывающей среде, а не в "envir").

Я подтвердил, что следующие работы, производящие результаты, которые соответствуют вашим jagsfit.p через все цифры, отображаемые методом печати объекта результата:

jagsfit.p2 <- do.call(jags.parallel, 
                      list(data=jags.data, inits=jags.inits, jags.params,
                           n.iter=n.iter, model.file=model.file))
Другие вопросы по тегам