0

データをバイナリ形式で書き込み (および後で取得) したい。少なくとも匂いテストのレベルまで機能する最小限の例を取得しようとしています (読み取り入力は書き込み出力のように見えるはずです) が、正しく一貫して正しく取得できていません。私のマシンはリトル エンディアンの Linux ですが、ここでは定数なので、呼び出しから省略しました。sizeまた、書き込みで引数を指定するか、省略した方がよいかどうかもわかりませんでした。とにかく、ロードされた入力は次のようには見えませんout:

out<-seq(1,50,2)

##write
write<-file('~/output.txt','wb')
writeBin(out,con=write,size=4)
close(write)

##read
read<-file('~/output.txt','rb')
readBin(con=read,what=numeric(),n=length(out))
# [1] 3.200001e+01 3.276801e+04 1.048576e+06 1.677722e+07 1.006633e+08 4.026532e+08     1.610613e+09 6.442452e+09 1.503239e+10 3.006478e+10 6.012955e+10 1.202591e+11
close(read)
4

1 に答える 1

7

これが実際の例です:

R> dat <- seq(1,50,2)
R> dat
 [1]  1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49
R> 

オブジェクトをバイナリ接続に書き込むだけです。3番目のパラメータを省略します。

R> con <- file("/tmp/foo.bin", "wb")
R> writeBin(dat, con)
R> close(con)
R> 

そして、読み返すことができます:

R> con <- file("/tmp/foo.bin", "rb")
R> dat2 <- readBin(con, what="numeric", n=length(dat))
R> dat2
 [1]  1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49
R>
R> all.equal(dat, dat2)
[1] TRUE

ただし、長さを保存する必要があります。私は、最初に行、列、「フォーマット番号」などに関する固定の(既知の)整数を書き込み、次に合計行*列の数値を読み書きする内部ファイル形式を使用しました。また、これをgzipで圧縮されたファイル接続にラップします。

これをデータフレームのように列を書き込むように一般化することもできますが、Rが唯一のリーダー/ライターである場合は、既存のシリアル化を介したsave()方が適しています。

于 2012-11-13T20:56:47.753 に答える