Отменить сериализацию строки в R

#r

Вопрос:

Предположим, у меня есть этот объект a :

 a <- list(x = 1, y = 2)
 

Я сериализовал и преобразовал ее в строку, используя следующий код:

 s <- serialize(a, NULL)
s2 <- paste0(s, collapse = "")
 

Итак, теперь у меня есть только s2 и мне нужно снова получить a . Я делаю это, но я получил сообщение об ошибке:

 s3 <- substring(s2, seq(1,nchar(s2),2), seq(2,nchar(s2),2))
s4 <- as.raw(s3)
Warning messages:
1: NAs introduced by coercion 
2: out-of-range values treated as 0 in coercion to raw 
unserialize(s4)
Error in unserialize(s4) : unknown input format
 

Я также пытался

 > charToRaw(s2) %>% unserialize()
Error in unserialize(.) : unknown input format
 

Мне действительно нужно s2 быть одноэлементным символьным вектором.
Как мне a вернуться?

Комментарии:

1. serialize является низкоуровневой функцией. Почему бы не использовать оболочку более высокого уровня, например, saveRDS с a textConnection ?

2. Как вы думаете, это лучше? Я пишу s2 в символьный столбец базы данных…

3. Честно говоря, saveRDS довольно плохо работает с текстовыми соединениями. Я бы, вероятно, придерживался вашего низкоуровневого решения. Лучшим решением, конечно, было бы использовать не символьный столбец в базе данных, а двоичный двоичный объект (или, что еще лучше, для сохранения структурированных данных; но я предполагаю, что в вашем случае это невозможно).

4. Спасибо! Я не могу сохранить данные структуры, поскольку рассматриваемый объект является моделью R. Но я обнаружил, что могу использовать двоичные столбцы в базе данных с помощью этого: msdn.microsoft.com/en-us/library/mt683483.aspx

Ответ №1:

as.raw не работает так, как необходимо для символов, сначала вам нужно преобразовать шестнадцатеричные цифры в числа:

 s4 = as.raw(as.integer(paste0('0x', s3)))
unserialize(s4)
 

Ответ №2:

Это dplyr воспроизводимый пример использования техники в отличном ответе @Konrad

Начните с некоторой строки / символа

 library(dplyr)
some_string <- 'something 123 something'
 

Сериализовать ее

 (serialized_char <- some_string %>% serialize(NULL) %>% as.character() %>% paste0(collapse = ""))
[1] "580a000000030003060200030500000000055554462d3800000010000000010004000900000017736f6d657468696e672031323320736f6d657468696e67"
 

Отменить сериализацию обратно в строку / символ

 (unserialized <- serialized_char %>% 
    {substring(., seq(1, nchar(.), 2), seq(2, nchar(.), 2))} %>% 
    paste0("0x", .) %>% 
    as.integer %>% 
    as.raw %>% 
    unserialize())
[1] "something 123 something"
 

И чтобы быть абсолютно уверенным, что это сработало

 some_string == unserialized
[1] TRUE