2017-04-21 2 views
1

안녕하세요, 저는 R에 3 차원 배열을 .bin 파일로 작성하여 나중에 FORTRAN에서 호출하려고합니다.배열을 .bin 파일에 쓰기 R

나는 다음과 같은 방법 사용 :

my.array <- array(1:36, dim=c(3,4,3)) 

zz <- file("new.bin", "wb") 
writeBin (my.array,zz, size = 8) 
close(zz) 

을하지만이 오류 메시지를 얻을 : 내가 생각

Error in writeBin(my.array, zz, size = 8) : can only write vector objects 

이 나는 ​​같이 벡터의 배열을 평평하게하는 경우

writeBin (as.vector(my.array),zz, size = 8) 

writeBin이 오류 메시지없이 실행되고 파일을 FORTRAN으로 읽을 수 있습니다 (How to write .bin file in R and open it in Fortran 참조).

그러나 나는 거대한 배열로 작업 할 것이므로 객체의 구조를 보존하는 데 관심이 있습니다.

개체 구조를 보존하는 R에 .bin을 쓸 수 있습니까?

답변

0

이진 데이터에는 "구조"가 없습니다. 객체의 구조를 바이너리 데이터로 만들려면 수동으로 무언가를 추가해야합니다. 예를 들어, 파일의 시작 부분에 일부 데이터를 추가 할 수 있습니다.

첫 번째 숫자는 차원 수 D입니다. 다음 D 숫자는 각 차원의 크기가됩니다. 나머지 바이트는 데이터입니다.

따라서, 귀하의 예제 같은 것을 보일 것이다 : 당신의 포트란 코드에서

writeBin(c(length(dim(my.array)), dim(my.array), my.array), raw(), size = 8) 
    [1] 03 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 03 
[26] 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 03 00 
[51] 00 00 00 00 00 00 04 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 06 00 00 
[76] 00 00 00 00 00 07 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 09 00 00 00 
[101] 00 00 00 00 0a 00 00 00 00 00 00 00 0b 00 00 00 00 00 00 00 0c 00 00 00 00 
[126] 00 00 00 0d 00 00 00 00 00 00 00 0e 00 00 00 00 00 00 00 0f 00 00 00 00 00 
[151] 00 00 10 00 00 00 00 00 00 00 11 00 00 00 00 00 00 00 12 00 00 00 00 00 00 
[176] 00 13 00 00 00 00 00 00 00 14 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 
[201] 16 00 00 00 00 00 00 00 17 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 19 
[226] 00 00 00 00 00 00 00 1a 00 00 00 00 00 00 00 1b 00 00 00 00 00 00 00 1c 00 
[251] 00 00 00 00 00 00 1d 00 00 00 00 00 00 00 1e 00 00 00 00 00 00 00 1f 00 00 
[276] 00 00 00 00 00 20 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00 22 00 00 00 
[301] 00 00 00 00 23 00 00 00 00 00 00 00 24 00 00 00 00 00 00 00 

을, 당신은 치수의 총 수를 찾는 첫 번째 숫자를 읽을 것, D.는 그런 다음에 다음 D 번호를 읽을 것 크기 또는 각 차원을 찾으십시오. 이제 Fortran에서 구조를 할당하고 나머지 데이터를 읽어 모든 요소를 ​​채울 수 있습니다.

+0

이진 데이터가 포맷되지 않은 것으로 알고 있습니다. 그러나 내가 R에있는 .bin에 그것을 쓰기 전에 여전히 배열을 평평하게 할 필요가있는 당신의 제안을 이해하고 있는가? – Larusson

+0

예, 먼저 벡터로 변환해야합니다. 그렇지 않으면 "벡터 오브젝트 만 쓸 수 있습니다"라는 오류가 발생합니다. –