[Rd] Change in grep behavior from 1.9.0 to R-patched

Prof Brian Ripley ripley at stats.ox.ac.uk
Fri Jun 11 18:21:06 CEST 2004


I think I have a solution I am just about to commit.  It looks as if the 
PCRE documentation I read is wrong as to when it is safe to free the 
locale-specific tables, and I've deferred doing so until much later.

Incidentally, I cannot make this misbehave on Windows.


On Fri, 11 Jun 2004, Prof Brian Ripley wrote:

> So the consensus is
> 
> - it happens equally in 1.9.0 and 1.9.1 alpha current
> - it happens in the C locale
> - it is random and bursty, as in
> 
> > d
>    [1] 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 
> 84 84
>   [25] 84 84 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 
> 13 13
>   [49] 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 
> 13 13
>   [73] 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 
> 13 13
>   [97] 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 
> 13 13
>  [121] 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 
> 13 13
>  [145] 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 84 84 84 84 
> 84 84
>  [169] 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 
> 84 84
>  [193] 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 13 13 84 84 84 13 
> 13 13
>  [217] 84 84 84 13 13 13 84 84 84 13 13 13 84 84 84 13 13 13 13 13 13 13 
> 13 13
> ...
> 
> So looks like a problem in the PCRE compiled code.
> 
> On Fri, 11 Jun 2004, Marc Schwartz wrote:
> 
> > On Fri, 2004-06-11 at 10:28, Prof Brian Ripley wrote:
> > > This is actually PCRE.  Something is wrong with your build of R-patched
> > > (1.9.1 alpha, I assume): I get 84 everywhere.  You are asking for a first
> > > character l, then one or more characters of `word' then tmean.  In your
> > > example this is the same as (in a suitable locale, including C)
> > > 
> > > length(grep("^l[A-Za-z0-9]+tmean", x, perl = TRUE, value = TRUE))
> 
> I omitted _ there, not that it mattered.
> 
> > > length(grep("^l[[:alnum:]_]+tmean", x, perl = TRUE, value = TRUE))
> > > 
> > > which each give 84.
> > > 
> > > One issue: PCRE is locale-dependent.  Did you use the same locale for 
> > > each?  What happens if you force LANG=C?
> > > 
> > > (I've just checked an R-devel Solaris system.  This gave 13 on a build 
> > > from Weds, and 84 when remade today.  The result with 13 seems truncated, 
> > > as they are the first 13.  Might be coincidental, of course.)
> > 
> > 
> > The above is confirmed using Version 1.9.1 alpha (2004-06-10) on FC2:
> > 
> > > x <- dget(file = url("http://www.biostat.jhsph.edu/~rpeng/names.R"))
> > > length(grep("^l[A-Za-z0-9]+tmean", x, perl = TRUE, value = TRUE))
> > [1] 84
> > > length(grep("^l[[:alnum:]_]+tmean", x, perl = TRUE, value = TRUE))
> > [1] 84
> > 
> > 
> > Also, to demonstrate Roger's follow up example:
> > 
> > > d <- replicate(1000, length(grep("^l\\w+tmean", x, perl = TRUE, value
> > = TRUE)))
> > > summary(d)
> >    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
> >   13.00   13.00   13.00   14.14   13.00   84.00 
> 
> table(d) is more informative.
> 
> > BTW: pcre-4.5-2
> 
> Did you use --with-pcre, though?
> 
> 

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



More information about the R-devel mailing list