From ripley at stats.ox.ac.uk  Mon Apr 28 12:54:27 2008
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Mon, 28 Apr 2008 11:54:27 +0100 (BST)
Subject: [Rd] R 2.7.0, match() and strings containing \0 - bug?
In-Reply-To: <68e086180804280300k67057773yc7e8003259c6c6cf@mail.gmail.com>
References: <68e086180804280300k67057773yc7e8003259c6c6cf@mail.gmail.com>
Message-ID: <alpine.LFD.1.10.0804281147120.3654@gannet.stats.ox.ac.uk>

On Mon, 28 Apr 2008, Jon Clayden wrote:

> Hi,
>
> A piece of my code that uses readBin() to read a certain file type is
> behaving strangely with R 2.7.0. This seems to be because of a failure
> to match() strings after using rawToChar() when the original was
> terminated with a "\0" character. Direct equality testing with ==
> still works as expected. I can reproduce this as follows:
>
>> x <- "foo"
>> y <- c(charToRaw("foo"),as.raw(0))
>> z <- rawToChar(y)
>> z==x
> [1] TRUE
>> z=="foo"
> [1] TRUE
>> z %in% c("foo","bar")
> [1] FALSE
>> z %in% c("foo","bar","foo\0")
> [1] FALSE
>
> But without the nul character it works fine:
>
>> zz <- rawToChar(charToRaw("foo"))
>> zz %in% c("foo","bar")
> [1] TRUE
>
> I don't see anything about this in the latest NEWS, but is this
> expected behaviour? Or is it, as I suspect, a bug? This seems to be
> new to R 2.7.0, as I said.

And so is the comment in ?match:

      Character inputs with embedded nul bytes will be truncated at the
      first nul.

The bug is in the documentation here -- this was intentional.

As support for embedded nuls in character strings is being removed in R 
2.8.0, you should not rely on this.

-- 
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



[Rd] R 2.7.0, match() and strings containing \0 - bug?
Prof Brian Ripley