読者です 読者をやめる 読者になる 読者になる

夜な夜な作業 => 色々バイナリにしたいじゃないですか!!

Google Summer of Code R

Rのデータ構造をバイナリにしたいと思って、Rinternals.hをのぞく。このヘッダーファイルをのぞいている日でろくな日はない気が(ry。

コーディングしていたら、3時くらいになっていて、次の日朝から授業ということを忘れていた。お腹減ったと思って、カップラーメン食べてる場合ではなかった。

以下、自分用メモ。

  • charToRawとかで文字列を16ビットのバイナリに変換
  • rawShift => Rでbit shiftするための関数?
    • helpのを見ると、1が右左にshiftしている様子が分かりやすくなっていてよい。こんな感じ
      • 計算機システム概論もRで勉強すべきだったか...
> showBits <- function(r) stats::symnum(as.logical(rawToBits(r)))
> z <- as.raw(5)
> z ; showBits(z)
[1] 05
[1] | . | . . . . .
> showBits(rawShift(z, 1)) # shift to right
[1] . | . | . . . .
> showBits(rawShift(z, 2))
[1] . . | . | . . .
> showBits(z)
[1] | . | . . . . .
> showBits(rawShift(z, -1)) # shift to left
[1] . | . . . . . .
> showBits(rawShift(z, -2)) # ..
[1] | . . . . . . .
> showBits(rawShift(z, -3)) # shifted off entirely
[1] . . . . . . . .

うーん、自分でCを頑張らなくってもR側でバイナリのベクトルに変換できるっぽいじゃないか。。。バイナリにしたいオブジェクトがvectorとかに限定されず、functionのようなオブジェクトもシリアライズできるようだ。ということで、rawが入っているvectorに限定して、putとかgetとかできるようにしておけばよい...だろうか。

> x <- serialize(list(1,2,3), NULL)
> x
 [1] 58 0a 00 00 00 02 00 02 0b 00 00 02 03 00 00 00 00 13 00 00 00 03 00 00 00
[26] 0e 00 00 00 01 3f f0 00 00 00 00 00 00 00 00 00 0e 00 00 00 01 40 00 00 00
[51] 00 00 00 00 00 00 00 0e 00 00 00 01 40 08 00 00 00 00 00 00
> unserialize(x)
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

> serialize(function(x) x, NULL)
  [1] 58 0a 00 00 00 02 00 02 0b 00 00 02 03 00 00 00 06 03 00 00 04 02 00 00 00
 [26] 01 00 00 00 09 00 00 00 06 73 6f 75 72 63 65 00 00 00 10 00 00 00 01 00 00
 [51] 00 09 00 00 00 0d 66 75 6e 63 74 69 6f 6e 28 78 29 20 78 00 00 00 fe 00 00
 [76] 00 fd 00 00 04 02 00 00 00 01 00 00 00 09 00 00 00 01 78 00 00 00 fb 00 00
[101] 00 fe 00 00 02 ff

serialize関数とかは普通のRのユーザーレベルだとload関数とかsave関数とかが(きっと)使っている関数じゃないんですかね。