Как заменить значение в двоичном файле в R?

Я должен работать с (пользовательским) двоичным форматом файла. Данные слишком велики для моей оперативной памяти, и мне просто нужно импортировать небольшую их часть, выполнить некоторые вычисления и перезаписать / заменить эту часть новыми значениями (поэтому я не хочу импортировать все, изменять конкретную часть и писать все назад).

Я попробовал комбинацию writeBin и writeBin но это создает небольшой файл с моим новым значением с добавлением нулей:

fn <- tempfile()

writeBin(1L:3L, fn, size = 1L)
readBin(fn, what = "integer", size = 1L, n = 3L)
#> [1] 1 2 3

fh <- file(fn, "wb")
isSeekable(fh)
#> [1] TRUE
seek(fh, 1L, origin = "start", rw = "write")
#> [1] 0
# swap the sign of the second value
writeBin(-2L, fh, size = 1L)
close(fh)

readBin(fn, what = "integer", size = 1L, n = 3L)
#> [1]  0 -2

unlink(fn)

Использование режима ab для добавления в файл также не помогает:

fn <- tempfile()

writeBin(1L:3L, fn, size = 1L)
readBin(fn, what = "integer", size = 1L, n = 3L)
#> [1] 1 2 3

fh <- file(fn, "ab")
isSeekable(fh)
#> [1] TRUE
seek(fh, 1L, origin = "start", rw = "write")
#> [1] 3
# swap the sign of the second value
writeBin(-2L, fh, size = 1L)
close(fh)

readBin(fn, what = "integer", size = 1L, n = 3L)
#> [1] 1 2 3

unlink(fn)

Мой ожидаемый результат будет 1 -2 3 .

Есть ли способ сделать это в R или я должен использовать C для этого?

Всего 1 ответ


После некоторых проб и ошибок я нашел решение сам: использование режима "r+b" поддерживает замену данных.

fn <- tempfile()

writeBin(1L:3L, fn, size = 1L)
readBin(fn, what = "integer", size = 1L, n = 3L)
#> [1] 1 2 3

fh <- file(fn, "r+b")
isSeekable(fh)
#> [1] TRUE
seek(fh, 1L, origin = "start", rw = "write")
#> [1] 0
# swap the sign of the second value
writeBin(-2L, fh, size = 1L)
close(fh)

readBin(fn, what = "integer", size = 1L, n = 3L)
#> [1]  1 -2  3

unlink(fn)

Я не пробовал этого раньше, потому что документация по режиму в ?file Не предлагает эту информацию:

'"wb"' Открыт для записи в двоичном режиме.

'"ab"' Открыт для добавления в двоичном режиме.

'"r +"', '"r + b"' Открыто для чтения и письма.


Есть идеи?

10000