开发者

Write binary file in R

开发者 https://www.devze.com 2023-03-26 15:01 出处:网络
I am asked to write R output in two binary files, an index file and a main data file. There will be one matrix/block corresponding to each id in the index file. I have read about writing binary files

I am asked to write R output in two binary files, an index file and a main data file. There will be one matrix/block corresponding to each id in the index file. I have read about writing binary files in R on th开发者_如何学JAVAe internet but I am not sure how to specify the format so that I can achieve this format?

Also, can we specify short integer in R? He said he wants the numebers to be short intergets (two bytes) and I don't want what that means.

I appreciate any input! Thanks


Since you didn't specify the problem very clearly, I made some assumptions in the sample code below. Given a list of matrices, it saves them to a .bin file and creates an .idx file with offsets. You can then load them back in again given an index. The 2-byte size you mentioned isn't used - it saves the matrix data as 8-byte doubles or 4-byte integers (but you could change that).

Here's how it's used:

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

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

...and here are the functions:

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)
}


See help(writeBin), size = 2 defines the allocation to each element (i.e. a two byte integer). But if you don't know what this means you probably will need a lot more information from your requester.

0

精彩评论

暂无评论...
验证码 换一张
取 消