[Rd] apropos changes in r-devel: intended feature or bug?

Deepayan Sarkar deepayan.sarkar at gmail.com
Fri Dec 22 19:16:38 CET 2006

On 12/22/06, Martin Maechler <maechler at stat.math.ethz.ch> wrote:
> >>>>> "DeepS" == Deepayan Sarkar <deepayan.sarkar at gmail.com>
> >>>>>     on Thu, 21 Dec 2006 22:07:27 -0800 writes:
>     DeepS> The old apropos started with: if
>     DeepS> (!is.character(what)) what <-
>     DeepS> as.character(substitute(what))
>     DeepS> The new one has:
>     DeepS>    if (character.only) stopifnot(is.character(what))
>     DeepS>    else what <- as.character(substitute(what))
>     DeepS> i.e., the check for is.character(what) is
>     DeepS> missing. This has the effect that 'what' can no
>     DeepS> longer be a character string generated by a function
>     DeepS> call unless 'character.only = TRUE'. I don't think
>     DeepS> this was intended; the change makes previously valid
>     DeepS> use invalid and I can't think of a situation where it
>     DeepS> is useful.
> [ Did you read the corresponding NEWS entry? ]

Yes, but I didn't connect all the dots. Anyway, I'm happy with either
option (my usage will have to modified anyway).

While we're on the topic of apropos, here's another question:it seems
that determining the mode of an object requires it to be loaded (and
evaluated), at least with the current 'exists' implementation. This
means that whenever 'mode' is not "any", all matching symbols are
loaded. So, something as innocuous looking as

apropos(".", mode = "logical")

will load every lazy-loaded symbol visible, even though very few
things match the mode:

[This is an older r-devel, 2006-11-29 r40062]

> system.time(print(apropos(".", mode = "logical")))
[1] ".noGenerics" "F"           ".noGenerics" "T"
   user  system elapsed
  0.640   0.008   0.648

## after loading a huge annotation package

> library(hgu133plus2)
> system.time(print(apropos(".", mode = "logical")))
[1] ".noGenerics" "F"           ".noGenerics" "T"
   user  system elapsed
 63.112   0.980  64.815

## repeating (now everything is loaded)

> system.time(print(apropos(".", mode = "logical")))
[1] ".noGenerics" "F"           ".noGenerics" "T"
   user  system elapsed
  0.144   0.000   0.143

Is there any hope of avoiding this loading? If not, it might be
helpful to put a note in one of the help pages.


More information about the R-devel mailing list