From maechler at stat.math.ethz.ch  Fri Sep 15 22:23:08 2006
From: maechler at stat.math.ethz.ch (Martin Maechler)
Date: Fri, 15 Sep 2006 22:23:08 +0200
Subject: [Rd] An update method for lists?
In-Reply-To: <eb555e660609151222u2f1a7856l6b5f786c8677966@mail.gmail.com>
References: <eb555e660609151222u2f1a7856l6b5f786c8677966@mail.gmail.com>
Message-ID: <17675.2988.727158.326024@stat.math.ethz.ch>

>>>>> "DeepS" == Deepayan Sarkar <deepayan.sarkar at gmail.com>
>>>>>     on Fri, 15 Sep 2006 12:22:15 -0700 writes:

    DeepS> Hi, since lattice uses nested lists in various
    DeepS> situations, it has had an unexported function called
    DeepS> updateList for a while, which looks like

 >>     > lattice:::updateList
 >>     function (x, val)
 >>     {
 >> 	if (is.null(x))
 >> 	    x <- list()
 >> 	if (!is.list(x))
 >> 	    stop("x must be NULL or a list")
 >> 	if (!is.list(val))
 >> 	    stop("val must be a list")
 >> 	xnames <- names(x)
 >> 	for (v in names(val)) {
 >> 	    existing <- v %in% xnames
 >> 	    if (existing && is.list(x[[v]]) && is.list(val[[v]]))
 >> 		x[[v]] <- updateList(x[[v]], val[[v]])
 >> 	    else x[[v]] <- val[[v]]
 >> 	}
 >> 	x
 >>     }
 
[I'm not sure I'd allow NULL for 'x';  typing list() instead of
 NULL is not much more, but when the function name even includes  'list'
 I'd really require a list for 'x']

You could hence collapse the first 6 lines to the single

   stopifnot(is.list(x), is.list(val))


    DeepS> Basically, it recursively replaces elements that have
    DeepS> been specified in val, leaving the other components
    DeepS> alone. I'm not aware of any other actual situation
    DeepS> where this is useful, but it certainly can be, so I
    DeepS> want to export this functionaliy. At least one other
    DeepS> person (Gabor) has also asked for that.

I've had a similar need only recently:
If a list is used to store "defaults" and you want a safe way to
change only a few of the values...
I presume you use this for manipulating the settings of lattice
parts ?

    DeepS> Now, as the name suggests, I think it might be
    DeepS> reasonable to export this as an update method for
    DeepS> "list" objects. Depending on what others (in
    DeepS> particular r-core) think, one of these things might
    DeepS> happen:

    DeepS> (1) I export it as updateList (or some other name) in lattice
    DeepS> (2) I export it as an S3 method update.list in lattice
    DeepS> (3) It gets added as an S3 method update.list in one of the base packages
or
    (4) it gets added as utility function updateList() to
        'utils' {= one of the base packages}

which I'd favor momentarily.
- update() is typically for updating *models* 
- it's not clear that this is *the* method for update()ing a list

I'm also a bit wondering if it wouldn't make sense to change the name to 
something like assignInList().

    DeepS> The default option is (1), and I guess Sept 19 is the deadline for any
    DeepS> of these to be included in R 2.4.0.

Yes, that's true for (3) & (4) are higher if you provide a patch
to R-devel (not R-alpha) which includes a man page ...  [but
don't hurry, I'd like to see other comments]

Martin




[Rd] An update method for lists?
Martin Maechler