Re: [Rd] relist, an inverse operator to unlist

From: Andrew Clausen <clausen_at_econ.upenn.edu>
Date: Mon, 14 May 2007 00:32:55 -0400

Hi Gabor,

Thanks for the interesting suggestion. I must confess I got lost -- is it something like this?

        relist <- function(flesh, skeleton=attributes(flesh)$skeleton)

For example:

        par <- list(mean=c(0, 0), vcov(rbind(c(1, 1), c(1, 1))))
        vector.for.optim <- unlist(par)
        print(attributes(vector.optim)$skeleton)    # the skeleton is stored!
        converted.back.again <- relist(par)

Some concerns:

Cheers,
Andrew

On Sun, May 13, 2007 at 07:02:37PM -0400, Gabor Grothendieck wrote:
> I suggest you define a "relist" class and then define an unlist
> method for it which stores the skeleton as an attribute. Then
> one would not have to specify skeleton in the relist command
> so
>
> relist(unlist(relist(x))) === x
>
> 1. relist(x) is the same as x except it gets an additional class "relist".
> 2. unlist(relist(x)) invokes the relist method of unlist on relist(x)
> returning another relist object
> 3. relist(unlist(relist(x))) then recreates relist(x)
>
>
> On 5/13/07, Andrew Clausen <clausen_at_econ.upenn.edu> wrote:
> >Hi all,
> >
> >I wrote a function called relist, which is an inverse to the existing
> >unlist function:
> >
> > http://www.econ.upenn.edu/~clausen/computing/relist.R
> >
> >Some functions need many parameters, which are most easily represented in
> >complex structures. Unfortunately, many mathematical functions in R,
> >including optim, nlm, and grad can only operate on functions whose domain
> >is
> >a vector. R has a function to convert complex objects into a vector
> >representation. This file provides an inverse operation called "unlist" to
> >convert vectors back to the convenient structural representation.
> >Together,
> >these functions allow structured functions to have simple mathematical
> >interfaces.
> >
> >For example, a likelihood function for a multivariate normal model needs a
> >variance-covariance matrix and a mean vector. It would be most convenient
> >to
> >represent it as a list containing a vector and a matrix. A typical
> >parameter
> >might look like
> >
> > list(mean=c(0, 1), vcov=cbind(c(1, 1), c(1, 0)))
> >
> >However, optim can't operate on functions that take lists as input; it
> >only likes vectors. The solution is conversion:
> >
> > initial.param <- list(mean=c(0, 1), vcov=cbind(c(1, 1), c(1, 0)))
> >
> > ll <- function(param.vector)
> > {
> > param <- relist(initial.param, param.vector)
> > -sum(dnorm(x, mean=param$mean, vcov=param$vcov, log=TRUE))
> > # note: dnorm doesn't do vcov... but I hope you get the
> > point
> > }
> >
> > optim(unlist(initial.param), ll)
> >
> >"relist" takes two parameters: skeleton and flesh. Skeleton is a sample
> >object that has the right "shape" but the wrong content. "flesh" is a
> >vector
> >with the right content but the wrong shape. Invoking
> >
> > relist(skeleton, flesh)
> >
> >will put the content of flesh on the skeleton.
> >
> >As long as "skeleton" has the right shape, it should be a precise inverse
> >of unlist. These equalities hold:
> >
> > relist(skeleton, unlist(x)) == x
> > unlist(relist(skeleton, y)) == y
> >
> >Is there any easy way to do this without my new relist function? Is there
> >any
> >interest in including this in R's base package? (Or anywhere else?) Any
> >comments on the implementation?
> >
> >Cheers,
> >Andrew
> >
> >______________________________________________
> >R-devel_at_r-project.org mailing list
> >https://stat.ethz.ch/mailman/listinfo/r-devel
> >



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Mon 14 May 2007 - 04:35:10 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Mon 14 May 2007 - 08:33:21 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.