[Rd] An update method for lists?
Martin Maechler
maechler at stat.math.ethz.ch
Fri Sep 15 22:23:08 CEST 2006
>>>>> "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
More information about the R-devel
mailing list