2011-08-08 14 views
4

Je suis invité à écrire la sortie R dans deux fichiers binaires, un fichier d'index et un fichier de données principal. Il y aura une matrice/bloc correspondant à chaque identifiant dans le fichier d'index. J'ai lu sur l'écriture de fichiers binaires dans R sur Internet mais je ne suis pas sûr de savoir comment spécifier le format afin que je puisse atteindre ce format?Écrire un fichier binaire dans R

De même, peut-on spécifier un entier court dans R? Il a dit qu'il voulait que les nombres soient courts (deux octets) et je ne veux pas savoir ce que cela signifie.

J'apprécie toute contribution! Merci

+1

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

+1

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

+0

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

Répondre

1

Voir aide (writeBin), taille = 2 définit l'allocation à chaque élément (c'est-à-dire un entier de deux octets). Mais si vous ne savez pas ce que cela signifie, vous aurez probablement besoin de beaucoup plus d'informations de votre demandeur.

3

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

+1 Bel exemple. – Iterator

Questions connexes