странная ошибка 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 перед передачей его в функцию?


person cboettig    schedule 23.05.2013    source источник


Ответы (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))
person Josh O'Brien    schedule 23.05.2013
comment
Что бы вы сделали, если бы данные действительно хранились в списке? т.е. если бы у вас были все данные как mydata=list(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), J=8.0)? Я запускал jags(data=mydata, ETC.) раньше, но с методом do.call здесь он не работает, потому что имена не найдены в среде, в которой он ищет. - person Kalin; 10.02.2015
comment
@user29020 user29020 -- Извините, я недостаточно использую зазубрины, чтобы ваш вопрос был для меня понятен, и никто другой не увидит его здесь в вопросе 2,5-летней давности. Я бы рекомендовал вам задать его как отдельный вопрос вместе с воспроизводимым примером на SO. (Конечно, вы можете сослаться на этот вопрос и ответить на свой вопрос.) Удачи! - person Josh O'Brien; 10.02.2015
comment
Спасибо за быстрый ответ. Я предпочитаю сохранять старые вопросы SO/SE, чтобы уменьшить дублирование. Так или иначе, получается, что мой вопрос был задан. Я просто еще не нашел. Вот оно: stackoverflow.com/questions/23790452/ - person Kalin; 10.02.2015
comment
@ user29020 Отлично! Рад слышать, что вы нашли это, и спасибо, что сообщили здесь. Как вы сказали, хорошо, когда эти связанные вопросы хорошо взаимосвязаны. - person Josh O'Brien; 10.02.2015