Написать бинарный файл в R - PullRequest
4 голосов
/ 09 августа 2011

Меня просят записать вывод R в два двоичных файла, индексный файл и файл основных данных. В индексном файле будет одна матрица / блок, соответствующий каждому идентификатору. Я читал о записи двоичных файлов в R в Интернете, но я не уверен, как указать формат, чтобы я мог достичь этого формата?

Также, мы можем указать короткое целое число в R? Он сказал, что хочет, чтобы числа были короткими интергетами (два байта), а я не хочу, чтобы это значило.

Я ценю любой вклад! Спасибо

Ответы [ 2 ]

4 голосов
/ 09 августа 2011

Поскольку вы не очень четко указали проблему, я сделал несколько предположений в приведенном ниже примере кода.Имея список матриц, он сохраняет их в файл .bin и создает файл .idx со смещениями.Затем вы можете загрузить их снова, указав индекс.Упомянутый вами 2-байтовый размер не используется - он сохраняет данные матрицы в виде 8-байтовых двойных или 4-байтовых целых чисел (но вы можете это изменить).

Вот как это используется:

mtx <- list(matrix(1:12,4), matrix(sin(1:12),4))
saveMatrixList("c:/foo", mtx)

loadMatrix("c:/foo", 1)
loadMatrix("c:/foo", 2)

... и вот функции:

saveMatrixList <- function(baseName, mtxList) {
    idxName <- paste(baseName, ".idx", sep="")
    idxCon <- file(idxName, 'wb')
    on.exit(close(idxCon))

    dataName <- paste(baseName, ".bin", sep="")
    con <- file(dataName, 'wb')
    on.exit(close(con))

    writeBin(0L, idxCon)

    for (m in mtxList) {
        writeBin(dim(m), con)
        writeBin(typeof(m), con)
        writeBin(c(m), con) 
        flush(con)

        offset <- as.integer(seek(con))
        cat('offset', offset)
        writeBin(offset, idxCon)
    }

    flush(idxCon)
}

loadMatrix <- function(baseName = "data", index) {
    idxName <- paste(baseName, ".idx", sep="")
    idxCon <- file(idxName, 'rb')
    on.exit(close(idxCon))

    dataName <- paste(baseName, ".bin", sep="")
    con <- file(dataName, 'rb')
    on.exit(close(con))

    seek(idxCon, (index-1)*4)
    offset <- readBin(idxCon, 'integer')

    seek(con, offset)
    d <- readBin(con, 'integer', 2)
    type <- readBin(con, 'character', 1)
    structure(readBin(con, type, prod(d)), dim=d)
}
1 голос
/ 09 августа 2011

См. Help (writeBin), size = 2 определяет распределение для каждого элемента (то есть двухбайтовое целое число).Но если вы не знаете, что это значит, вам, вероятно, потребуется гораздо больше информации от вашего заявителя.

...