В R, как записать вывод optim() в текстовый файл из функции, вызываемой несколько раз

Я использую optim() внутри функции, которая получает повторные вызовы в зависимости от определенного условия. Я хотел бы сохранить результаты каждого вызова optim() в текстовом файле вместе с используемыми значениями параметров.

Следующий код дает мне текстовый файл со значениями параметров, но не дает оптимального вывода ($par, $values, сходимость, сообщения и т. д.)

Я пробовал использовать print(ans), но вывод optim() перезаписывал существующие данные в текстовом файле. Установка "flush.console" после optim() также не дала мне никакого результата.

Это часть моего кода:

Q2 <- function(s,hf,cumhf) {
    beta<-c(s[1],s[2],s[3])
    alpha<-s[4]
    sigma<-s[5]
    call1<-call1+1
    cat("Q2 ",call1,"\t",s[1],"\t",s[2],"\t",s[3],"\t ",hf[1,1],"\t ",cumhf[1,1],"\t",alpha,"\t",sigma,"\n",file="dump.txt",append=TRUE)
    #browser()
    sink(file="dump.txt",append=TRUE,type=c("output","message"))
    expq2<-function(par){
        alpha<-par[1]
        sigma<-par[2]
        cat("call from expq2 value sigma = ",sigma,"\n",file="dump.txt",append=TRUE)    
        sum2<-0
        for(i in 1:50){
            sum2<-sum2+expectationlogfrailty(i,beta,alpha,sigma)
        }
        return(sum2)
    }
    ans<-optim(c(alpha,sigma),fn=expq2,gr=NULL,method="L-BFGS-B",lower=c(-Inf,0),upper=c(Inf,Inf),control=list(maxit=250,fnscale=-1))
    cat("optim function summary ",append=TRUE)
    ans
    est<-ans$par
    s<-c(beta,est)
    return(s)
}

Текстовый файл должен выглядеть примерно так:


Q2 1 -0,5675807 -0,4689595 -0,06068879 0,02349636 7,792965 0 1
вызов из expq2 value sigma = 1
вызов из expq2 value sigma = 1
.
.
.
вызов из expq2 значение sigma = 2,133043
вызов из expq2 значение sigma = 2,131043
сводка оптимальных функций
$par

1.186385e-06 2.132043e+00

$значение [1] -113,9802

Функция $counts градиент 7 7

$конвергенция [1] 0

$message [1] "КОНВЕРГЕНЦИЯ: REL_REDUCTION_OF_F ‹= FACTR*EPSMCH"


Это всего лишь 1 вызов этой функции. Последние 5 строк вызывают у меня проблемы: либо нет вывода, либо они перезаписывают 5 верхних строк текстового файла. Любые идеи о том, как я могу каждый раз добавлять этот вывод в текстовый файл?


person user3410300    schedule 12.03.2014    source источник


Ответы (1)


Возможно, вам повезет больше, если вы откроете соединение с файлом заранее и напишите в соединение (чтобы оно добавилось), а не в зависимости от аргумента добавления к sink и cat. Поскольку сейчас одна из команд может еще не записаться в файл (удерживая вывод в буфере), когда другая функция открывает тот же файл, и вы теряете вывод в буфере. Запись обоих в дескриптор открытого файла может работать лучше. Вы также можете взглянуть на функцию flush, чтобы убедиться, что каждая функция записала свой вывод перед вызовом другой.

Также у вас есть ans сама по себе внутри функции, но автопечать внутри функций не происходит, если вы хотите, чтобы текст был напечатан, вам нужно напрямую использовать функцию print.

person Greg Snow    schedule 12.03.2014