Puisque vous n'avez pas précisé le problème très clairement, j'ai fait quelques suppositions dans l'exemple de code ci-dessous. Étant donné une liste de matrices, il les enregistre dans un fichier .bin
et crée un fichier .idx
avec des décalages. Vous pouvez ensuite les charger à nouveau en fonction d'un index. La taille de 2 octets que vous avez mentionnée n'est pas utilisée - elle enregistre les données de la matrice sous la forme de doubles de 8 octets ou d'entiers de 4 octets (mais vous pouvez changer cela).
Voilà comment il est utilisé:
mtx <- list(matrix(1:12,4), matrix(sin(1:12),4))
saveMatrixList("c:/foo", mtx)
loadMatrix("c:/foo", 1)
loadMatrix("c:/foo", 2)
... et voici les fonctions:
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)
}
Une recherche rapide en utilisant '[r] fichier' binaire sur StackOverflow la question suivante révèle très similaire : http://stackoverflow.com/q/1635278/602276 – Andrie
Lorsque @mdsummer écrit, vous pouvez spécifier comment écrire des entiers de taille 2, mais l'énoncé du problème est assez vague. Les entiers de la matrice sont-ils des entiers ou sont-ils des entiers? Ou peut-être que les ids sont des ficelles? – Tommy
Bienvenue dans StackOverflow! Si l'une des réponses est ce dont vous avez besoin, vous devez la marquer comme une réponse. Sinon, mettez à jour votre question pour clarifier ce dont vous avez besoin. Vous devriez également modifier les réponses (et les questions) que vous aimez. Il suffit de cliquer sur le score en haut à gauche! – Tommy