2011-08-08 223 views
4

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

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

我很欣赏任何输入!谢谢

+1

使用'快速搜索[R]在计算器上的二进制file'揭示了以下非常类似的问题:http://stackoverflow.com/q/1635278/602276 – Andrie

+1

正如@mdsummer写道,你可以指定如何写大小为2的整数,但你的问题语句是相当含糊的。矩阵数据是整数还是IDS整数?或者也许这些ID是字符串? – Tommy

+0

欢迎来到StackOverflow!如果这里的答案之一是你需要的,你应该将其标记为答案。否则,更新你的问题,以澄清你需要什么。你也应该提高你喜欢的答案(和问题)。只需点击左上角的分数! – Tommy

回答

1

查看帮助(writeBin),size = 2定义了对每个元素的分配(即一个两字节的整数)。但是,如果你不知道这意味着什么,那么你可能需要来自请求者的更多信息。

3

由于您没有很清楚地指出问题,所以我在下面的示例代码中做了一些假设。给定一个矩阵列表,它将它们保存到一个.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) 
} 
+0

+1不错的例子。 – Iterator