as.raw и другие функции as. * удаляют атрибут измерения при применении к массивам - PullRequest
3 голосов
/ 14 октября 2019

Кажется, у меня есть простая проблема в R, для которой я не нашел простого решения: я хотел бы преобразовать массив целых чисел в raw. Преобразование между другими простыми типами имеет аналогичную проблему. Я нашел следующие не элегантные решения:

  1. используйте as.raw и создайте новый массив со старыми размерами:
a <- array(255:261,c(2,3))
b <- array(as.raw(a),dim(a))
используйте as.raw и сбросьте атрибут измерения:
a <- array(255:261,c(2,3))
b <- as.raw(a)
dim(b) <- dim(a)
изменить режим хранения
a <- array(255:261,c(2,3))
b <- a
storage.mode(b) <- "raw"

Все решения действительно сложны для чего-то простого. В решениях 1 и 2 as.raw (как и другие функции. *) Удаляет атрибут dim, поэтому его необходимо сбросить. Решения 2 и 3 не поддерживают напрямую стиль функционального программирования, т. Е. Они не возвращают копию a с новым типом и, следовательно, не могут быть легко использованы с трубопроводом. Конечно, я могу создать новую функцию для поддержки функционального программирования, но я предполагаю, что я пропускаю что-то простое. Пожалуйста, просветите меня. Спасибо.

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Я предлагаю использовать ваш последний подход. Если дело касается функционального программирования, то хорошо storage.mode<- - это функция.

"storage.mode<-"(a, "raw")
#     [,1] [,2] [,3]
#[1,]   ff   00   00
#[2,]   00   00   00
#Warning message:
#out-of-range values treated as 0 in coercion to raw 

a
#     [,1] [,2] [,3]
#[1,]  255  257  259
#[2,]  256  258  260
1 голос
/ 14 октября 2019

Некоторые другие способы преобразования типа:

b <- "dim<-"(as.raw(a), dim(a))

b  <- "storage.mode<-"(a, "raw")

b <- apply(a, 2, as.raw)

, если типы совместимы, чем as.raw, вы можете использовать:

a[]  <- as.double(a)

Данные:

a <- array(55:61,c(2,3))

Не рекомендуется (спасибо комментарию @Roland), так как raw является неявным классом, его явная установка может иметь непредвиденные последствия:

b <- a; class(b) <- "raw"
...