Я хотел бы отправить объект сложного гетерогенного списка в двоичном виде в ответ на запрос REST службе R (используя сантехника), чтобы при декодировании на другой стороне он преобразовывался обратно в свой первоначальный формат списка.
До сих пор мне удавалось сделать это, используя промежуточные файлы RDS, прочитав и слегка изменив Base64, кодирующий файл .Rda .
Ниже приводится описание MWE, объясняющее мои усилия и проблемы:
foodata <- list('a' = 1,
'b' = 'hello world',
'pi' = 3.14,
'strvec' = letters[1:5],
'intvec' = 1:5,
'df' = data.frame('df1' = letters[1:5], 'df2' = 1:5),
'z' = 26)
fn <- "test.rds"
fnb4 <- "test.rdsb64"
decoded <- "decoded.rds"
saveRDS(foodata, file = fn, compress = F)
#write base64 encoded version
library(base64enc)
txt <- base64enc::base64encode(fn)
#decode base64 encoded version
rdsbin <- base64enc::base64decode(txt)
# how to convert rdsbin back to the foodata list without using the intermediate step of saving to a file as follows?
ff <- file(decoded, "wb")
writeBin(rdsbin, ff)
close(ff)
bardata <- readRDS(decoded)
print(identical(foodata, bardata))
# [1] TRUE
Есть ли способ избежать чтения / записи промежуточных файлов? Или совсем другой подход?