在R中写二进制文件

时间:2011-08-08 23:05:11

标签: r binary integer byte binaryfiles

我被要求在两个二进制文件,索引文件和主数据文件中写入R输出。将有一个矩阵/块对应于索引文件中的每个id。我已经读过关于在互联网上写R的二进制文件,但我不知道如何指定格式以便我可以实现这种格式?

另外,我们可以在R中指定短整数吗?他说他希望数字是短暂的间隔(两个字节),我不想要这意味着什么。

我感谢任何输入!感谢

2 个答案:

答案 0 :(得分:4)

由于您没有非常明确地指出问题,我在下面的示例代码中做了一些假设。给定一个矩阵列表,它将它们保存到.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 :(得分:1)

参见help(writeBin),size = 2定义了每个元素的分配(即两个字节的整数)。但如果您不知道这意味着什么,您可能需要来自请求者的更多信息。

相关问题