Try something like this. If ..Name exists in the proto object it uses that as the name; otherwise, it uses the name.proto() heuristic to find the name.
library(proto) dput.proto <- function(x, ...) { y <- as.list(x, all = TRUE) if (!exists("..Name", x)) y$..Name <- name.proto(x, parent.frame()) y$.parent.Name <- name.proto(parent.env(x), parent.frame()) dput(y, ...) } p <- proto(a = 1, f = function(.) { .$a <- .$a + 1}) q <- p$proto(a = 2) dput.proto(p) dput.proto(q) Output: > library(proto) > p <- proto(a = 1, f = function(.) { .$a <- .$a + 1}) > q <- p$proto(a = 2) > dput.proto(p) structure(list(.super = <environment>, .that = <environment>, a = 1, f = function (.) { .$a <- .$a + 1 }, ..Name = "p", .parent.Name = "R_GlobalEnv"), .Names = c(".super", ".that", "a", "f", "..Name", ".parent.Name")) > dput.proto(q) structure(list(.super = <environment>, .that = <environment>, a = 2, ..Name = "q", .parent.Name = "p"), .Names = c(".super", ".that", "a", "..Name", ".parent.Name")) On Mon, Feb 25, 2008 at 2:17 PM, Vadim Organovich <[EMAIL PROTECTED]> wrote: > Thank you Gabor! This is very close indeed to what I need. If dput() were > generic one could code dput.proto() and that would be it. > > Anyway, it is so close to what I need that I should be able to hack someting > to make it work for my purposes. Thanks again! > > Vadim > > ________________________________________ > From: Gabor Grothendieck [EMAIL PROTECTED] > Sent: Monday, February 25, 2008 12:16 PM > To: Vadim Organovich > Cc: r-devel@r-project.org > Subject: Re: [Rd] how to write dput-able objects > > > You might want to look at the proto package. proto objects won't > immediately dput either but it would not be hard to convert them to > restorable character strings because the proto methods normally > have their object as their parent environment so its implicit in the > definition. First define a proto object p with one variable 'a' and one > method 'f' and a child object, q, whose 'a' component overrides the > 'a' in its parent. > > > library(proto) > > p <- proto(a=1, f = function(.) .$a <- .$a + 1) > > q <- p$proto(a = 2) > > p$as.list() > $a > [1] 1 > > $f > function(.) .$a <- .$a + 1 > <environment: 0x01d6e284> > > > name.proto(p) > [1] "p" > > name.proto(p$parent.env()) > [1] "R_GlobalEnv" > > q$as.list() > $a > [1] 2 > > > name.proto(q) > [1] "q" > > name.proto(q$parent.env()) > [1] "p" > > Note that the strings above have everything > you would need to restore them. We don't > need the environment since we already know that > f's environment must be p as it belongs to p. > > On Mon, Feb 25, 2008 at 12:47 PM, Vadim Organovich > <[EMAIL PROTECTED]> wrote: > > Hi, > > > > One way of doing object-oriented programming in R is to use function > > environment to hold object's data, see for example > > @Article{Rnews:Chambers+Lang:2001a, > > author = {John M. Chambers and Duncan Temple Lang}, > > title = {Object-Oriented Programming in {R}}, > > journal = {R News}, > > year = 2001, > > volume = 1, > > number = 3, > > pages = {17--19}, > > month = {September}, > > url = http, > > pdf = Rnews2001-3 > > } > > > > One deficiency of this approach is that dput() does not export all data > > pertained to the object. For example > > > > > objfactory <- function(nm) { > > + list(name = function() nm) > > + } > > > > > > > > > obj <- objfactory('foo') > > > > > > obj$name() > > [1] "foo" > > > dput(obj) > > structure(list(name = function () > > nm), .Names = "name") > > As one can see the data piece of the obj, nm='foo', is not exported. Is > > there a way to modify the original approach so that dput() will produce a > > self-sufficient dump of the object? > > > > Thanks, > > Vadim > > > > [[alternative HTML version deleted]] > > > > ______________________________________________ > > R-devel@r-project.org mailing list > > https://stat.ethz.ch/mailman/listinfo/r-devel > > > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel