#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
с atextConnection
?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