From michael.weylandt at gmail.com  Tue Aug 28 20:14:56 2012
From: michael.weylandt at gmail.com (R. Michael Weylandt)
Date: Tue, 28 Aug 2012 13:14:56 -0500
Subject: [Rd] Don't dput() data frames?
In-Reply-To: <DE41AE7A-F75D-40AF-B9C9-AF70A6771489@r-project.org>
References: <CAAmySGMtCb9dA1=iNZ_FW8J4498q93RcPjAQFTr5cj_f7YzjPw@mail.gmail.com>
	<DE41AE7A-F75D-40AF-B9C9-AF70A6771489@r-project.org>
Message-ID: <CAAmySGOW1VXyn-jLXJS6xVq2VNi1BpF2ws1nnK0DmS-z4V+_Og@mail.gmail.com>

On Tue, Aug 28, 2012 at 1:00 PM, Simon Urbanek
<simon.urbanek at r-project.org> wrote:
>
> On Aug 28, 2012, at 1:51 PM, R. Michael Weylandt wrote:
>
>> /src/main/attrib.c contains this comment in row_names_gets():
>>
>>  /* This should not happen, but if a careless user dput()s a
>>           data frame and sources the result, it will */
>>
>> which svn blame says Prof Ripley placed there in r39830 with the
>> commit message "correct the work of dput() on the row names of a data
>> frame with compact representation."
>>
>> Is there a problem / better way to use the result of a hefty dput than
>> source()ing it?
>
> It's pretty much the least efficient and most dangerous (as in insecure) way. That's why there is serialization instead ...
>

My most common use of dput() is for sending plain text data over
r-help; would this be an official/unofficial advisement to push folks
to use

serialize(x, NULL, ascii = TRUE)

instead? At first blush that seems to be less space efficient:

sum(nchar(capture.output(dput(iris)))) # 3767

sum(nchar(serialize(iris, NULL, ascii = TRUE))) # 5922: probably even
more if we dump it properly to plain text in a copy+pasteable form

Michael

> Cheers,
> Simon
>
>
>
>> This seems to work rather robustly:
>>
>> data(iris)
>> source(textConnection(paste0("iris2 <- ", capture.output(dput(iris)))))
>> identical(iris, iris2)
>>
>> Cheers,
>> Michael
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>>
>



[Rd] Don't dput() data frames?
R. Michael Weylandt