2011-08-08 2 views
4

두 개의 이진 파일, 색인 파일 및 주 데이터 파일에 R 출력을 쓰도록 요청 받았습니다. 색인 파일의 각 ID에 해당하는 하나의 행렬/블록이 있습니다. 인터넷에서 R에 이진 파일을 쓰는 것에 대해 읽었지만이 형식을 얻을 수 있도록 형식을 지정하는 방법을 모르겠습니다.이진 파일 쓰기 R

또한, R에 짧은 정수를 지정할 수 있습니까? 그는 숫자가 짧은 틈새 (2 바이트)가되기를 원한다고 나는 그것이 의미하는 것을 원하지 않는다고 말했다.

나는 어떤 의견을 주셔서 감사합니다! 감사합니다

+1

'사용하여 빠른 검색이 [R]를 StackOverflow의 이진 file'은 다음과 매우 비슷한 질문을 보여준다는 : http://stackoverflow.com/q/1635278/602276 – Andrie

+1

@mdsummer가 쓰는 것처럼 크기 2의 정수를 작성하는 방법을 지정할 수 있지만 문제 문은 매우 모호합니다. 행렬 데이터가 정수입니까, 아니면 정수입니까? 아니면 id가 문자열일까요? – Tommy

+0

StackOverflow에 오신 것을 환영합니다! 여기서 대답 중 하나가 필요한 경우 답변으로 표시해야합니다. 그렇지 않으면 질문을 업데이트하여 필요한 것을 명확히하십시오. 당신은 또한 당신이 좋아하는 대답 (및 질문)을 upvote해야합니다. 왼쪽 상단의 점수를 클릭하십시오! – Tommy

답변

1

help (writeBin) 참조, size = 2는 각 요소 (즉, 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