Skip to content

Instantly share code, notes, and snippets.

@noamross
Last active November 17, 2023 03:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save noamross/ee9e38089b51e7dacdd2caebbec3a6de to your computer and use it in GitHub Desktop.
Save noamross/ee9e38089b51e7dacdd2caebbec3a6de to your computer and use it in GitHub Desktop.
dput() but with compressed binary serialized to 7-bit character text ¯\_(ツ)_/¯
dput_binary <- function(object, compression = "xz") {
encoded <- strsplit(rawToChar(serialize(memCompress(serialize(object, NULL), type = compression), NULL, ascii = TRUE)), "\n")[[1]]
header <- gsub(" ", "", capture.output(dput(encoded[c(1:8)])))
body <- paste0("\"", paste(encoded[-c(1:8)], collapse = ""), "\"")
#The `gsub()` call here is to remove any whitespace or newlines introduced in
#printing and copy/paste
all <- paste0(
'unserialize(memDecompress(unserialize(textConnection(c(gsub("[\\\\s\\\\n]","",',
header,
"),strsplit(",
body,
',"(?<=.{2})",perl = TRUE)[[1]]),"r"))))'
)
cat(all)
invisible(all)
}
binarized <- capture.output(dput_binary(iris))
unbinarized <- eval(parse(text = binarized))
identical(iris, unbinarized)
#> [1] TRUE
object.size(binarized)
#> 2216 bytes
object.size(iris)
#> 7256 bytes
nchar(binarized)
#> [1] 2105
nchar(paste(capture.output(dput(iris)), collapse = "\n"))
#> [1] 3739
dput_binary(iris)
#> unserialize(memDecompress(unserialize(textConnection(c(gsub("[\\s\\n]","",c("A","3","262913","197888","5","UTF-8","24","964")),strsplit("fd377a585a0000016922de36020021011c00000010cf58cce016a503865d002c027c19f9aff41d3cb17e60f4b01849a903e796000242f293f91f73881d522c15c6a4e8f49c41cd92a6c22c48ad0af4acadb92f942f5ce7729a79fcec55a4cdaf8e3c7fc76d4990f2fa4398b2ecc8d7353fa2d327d890cfed09d078040e4a48e861474f1ca3d823f4072789f03a9708a749f28f84f93da12395a71ecdc5c281796151564a2051c05be47f669458bf4e5187b42b862f002c615e053699dbad50c09957950b3db5030604634dd359a1a1a53ed960a3bf8e34d9cefca6bab2f5e77dd68fb4c6453cbff89a70fc97b02275ea3bd76e1e5434eefb1915482b91f09e260a736fa5df924f000751e0b075105c363266b61e2172546c22bea2c7272a0e35b861d16a1d27b60e0ad58636edaaeb2cfd7450c554188bd4c148223ce78e09d84499c57c55f5e9444f228440d4ea12144baabf43317b7370fc49020e8ff184316f13a9fb08ff8d37b89a97f53ee343bcd4f6a9b6047c6b26e39ffd1c8c487967c702a6b89c6cd38ef45ea5315ccb54a09e33fbbcd594c40fb4787ec8cdfdfcd405a006d235d333557a64486dfe6cde824a056c59c508e354cdab36ef8edbdba18de324de84f3489a2e26aa234e9be82b530085eb6f38aae754801991667192a4c7388e12e633e736fb52abe28cf8724cadc7cddbeb902dbb295a807d882aa45de1655644f97ffac00e9137928a1690bcd84a98eab1986a5a2661646016527ef35b08774ba5347ce623361d3333a4bbd053c8453d31be216cbe1280222c7a69e8f27f6e5f931302eb4df4a7b10dfd3901f4ff7d1430bf1a0cea501d20bb6aef030f81de8761f2d8b75e311ba3cfea277fc69fa49976ff2e7c5aeacdacd22c72d663af6137775b5387bc2758200eeb8561bb3e681d0ed4f730ed343141a0556fb29ba111bbe769acaf0b8fd82756b0bc04dad12e3ac0028aa704bc30f0857c92ac3f473227b8176a535b6152637c8143374d9fffe81e1b3ff013f766a5709195a7282d8aece7dd8b57ae53861898939e080cffc6ecb9c4764ae159bd5be4110ee7b68c5500fe7f039a69d236e30f6b134dc59f7511879e3985c59a97972737fec82ec87f78e188ff29e8bd9a86672cf71b696c9af3ed8d1ebb5209f1b8c801a471854fa4598f66875134cc9d908fa13e1d4b907817c86f00162a195aa8d6338b0554ea94bf9cafd75a8a762daab2bac3a43e285d74ae2935de9588758b44ad94b707818dab322a05b52e6686b911ff633bdf4416314e14fde4ecada8b3a07c983293d618c4000000004dbd496b00019e07a62d000094ec8c0e3e300d8b020000000001595a","(?<=.{2})",perl = TRUE)[[1]]),"r"))))
#How does it compare to base64?
saveRDS(iris, "iris.rds", compress = "xz")
base64enc::base64encode("iris.rds")
#> [1] "/Td6WFoAAAFpIt42AgAhARYAAAB0L+Wj4BalA39dACwCfBn5r/QdPLF+YPSwGEmpA+eWAAJC8pP5H3OIHVIsFcak6PScQc2SpsIsSK0K9KytuS+UL1zncpp5/OxVpM2vjjx/x21JkPL6Q5iy7MjXNT+i0yfYkM/tCdB4BA5KSOhhR08co9gj9AcnifA6lwinSfKPhPk9oSOVpx7NxcKBeWFRVkogUcBb5H9mlFi/TlGHtCuGLwAsYV4FNpnbrVDAmVeVCz21AwYEY03TWaGhpT7ZYKO/jjTZzvymurL1533Wj7TGRTy/+Jpw/JewInXqO9duHlQ07vsZFUgrkfCeJgpzb6Xfkk8AB1HgsHUQXDYyZrYeIXJUbCK+oscnKg41uGHRah0ntg4K1YY27arrLP10UMVUGIvUwUgiPOeOCdhEmcV8VfXpRE8ihEDU6hIUS6q/QzF7c3D8SQIOj/GEMW8TqfsI/403uJqX9T7jQ7zU9qm2BHxrJuOf/RyMSHlnxwKmuJxs0470XqUxXMtUoJ4z+7zVlMQPtHh+yM39/NQFoAbSNdMzVXpkSG3+bN6CSgVsWcUI41TNqzbvjtvboY3jJN6E80iaLiaqI06b6CtTAIXrbziq51SAGZFmcZKkxzmepKhh1XR5ezgbunnaCcJAvxBhJ2UJYPWsNIjgQoohAHuEezWEz3PMljimN7aaYNL2i6m4Gm4l2rgjsIvKbr/GYiSyKcrUcPKbave2AxKJ3RvOmUxp7vqw9AFhU4pUYIzSfmHcz4o3WgWH+4x/Yucv5IBuadxu6vwuGanSa7jpmpxNEvp63Q//N5pCX5nUDA4qKfNeydGeB0snwtNY0G3FmwN3DVFJ8wEHe8FObXvs2ji1QWFtrNUo+eFixzIMzLNWvG8BL5oVKD/rkeLsnlfRcMKvn2tIcru2Vm1Zf2FNJGe3JVkQiXkBgx9AH1zbthYAhROpeFWC3ZIvcak6a7AHMHxfalfjyDxvXoHMEypU13ccxKuxTAVpKovikCpIZYgkDFBsIks1DvWWcCwwNNoYN/SO7O/t+m43fwdIDJMMJD7LJdPxIo71Vxo5rUtOxiPEnvCxJJHSYXsNxf8M+9Mj9qn6xkyD/jmVbNjFoDouTYHRc2w4076RBIjvjfpjVOI9JkC1YnyrRN19O4OL9E8qKKQZso5zwYy9scI4QVW9+S3R9uMGdbc9M8WDRMIQ9gaoGWONiPgiJT4GSAAAAE29SWsAAZcHpi0AAFy9gyk+MA2LAgAAAAABWVo="
# MIT LICENSE
#
# Copyright 2018 Noam Ross
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment