2017-04-21 7 views
1

Hei、後でFORTRANから呼び出すためにRの3次元配列を.binファイルに書き込もうとしています。配列を.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数値は各次元のサイズになります。残りのバイトはデータです。

だから、あなたの例のようなものになります:あなたのFortranコードで

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

はい、最初にベクトルに変換する必要があります。それ以外の場合は、 "ベクトルオブジェクトのみを書き込むことができます"というエラーが表示されます。 –

関連する問題