From amiransk at uwo.ca  Tue Jan 20 07:02:35 2009
From: amiransk at uwo.ca (Andriy Miranskyy)
Date: Tue, 20 Jan 2009 01:02:35 -0500
Subject: [Rd] sub and gsub treat \\ incorrectly (PR#13454)
In-Reply-To: <77EB52C6DD32BA4D87471DCD70C8D70087E0C9@NA-PA-VBE03.na.tibco.com>
References: <20090119182513.1B9FC282EFC1@mail.pubhealth.ku.dk>
	<77EB52C6DD32BA4D87471DCD70C8D70087E0C9@NA-PA-VBE03.na.tibco.com>
Message-ID: <1457078506.20090120010235@uwo.ca>

Thank you, William! This makes things clearer.

I am trying to create a tiny converter of free text to Tex format. In
order to do that I need to replace all "_" with "\_" and all "&"
with "\&". Could you please tell me, is there a way of doing it using
gsub?

Regards,
Andriy

Monday, January 19, 2009, 6:24:56 PM, you wrote:

>> -----Original Message-----
>> From: r-devel-bounces at r-project.org 
>> [mailto:r-devel-bounces at r-project.org] On Behalf Of amiransk at uwo.ca
>> Sent: Monday, January 19, 2009 10:25 AM
>> To: r-devel at stat.math.ethz.ch
>> Cc: R-bugs at r-project.org
>> Subject: [Rd] sub and gsub treat \\ incorrectly (PR#13454)
>> 
>> Sub and gsub treat \\ replacement pattern incorrectly
>> 
>> I expect
>>   sub("a","\\", "a", perl=T)
>> to produce
>>   [1] "\"
>> instead it generates
>>   [1] ""
>> 
>> On the other hand, if I run
>>   sub("a","\\\\", "a", perl=T)
>> it correctly outputs
>>   [1] "\\"

> The replacement pattern may include \\digit, which means
> to put the digit'th parenthesized subexpression into the
> replacement.  E.g.
>    > sub("([[:alpha:]]+) +([[:alpha:]]+)", "\\2 \\1", "One two three
> four five")
>    [1] "two One three four five"
>    > gsub("([[:alpha:]]+) +([[:alpha:]]+)", "\\2 \\1", "One two three
> four five")
>    [1] "two One four three five"
> To support this without ambiguity or surprises, \\ is expected
> to be followed by a digit (or L or U when perl=TRUE).

> When fixed=TRUE then there is no possibility of a parenthesized
> subexpression so \\2 is taken literally.

> help(gsub) is not explicit about this behavior.

> Because I initially made the same mistake, when I wrote the S+
> versions of gsub and sub I included a warning when the replacement
> included a \\ not followed by a digit:

  >> gsub("([[:alpha:]]+) +([[:alpha:]]+)", "\\ \\", "One two three four
> five")
>   [1] "    five"
>   Warning messages:
>     backslash in replacement argument of substituteString(fixed=F) is
> not
>           followed by backslash or digit, hence backslash is omitted in:
> substit\
>           uteString(pattern = pattern, replacement = replacement, x = x,
> extended ....

>> The same issue applies to gsub.
>> 
>> --please do not edit the information below--
>> 
>> Version:
>>  platform = i386-pc-mingw32
>>  arch = i386
>>  os = mingw32
>>  system = i386, mingw32
>>  status = 
>>  major = 2
>>  minor = 8.1
>>  year = 2008
>>  month = 12
>>  day = 22
>>  svn rev = 47281
>>  language = R
>>  version.string = R version 2.8.1 (2008-12-22)
>> 
>> Windows XP (build 2600) Service Pack 2
>> 
>> Locale:
>> LC_COLLATE=English_United States.1252;LC_CTYPE=English_United 
>> States.1252;LC_MONETARY=English_United 
>> States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252
>> 
>> Search Path:
>>  .GlobalEnv, package:stats, package:graphics, 
>> package:grDevices, package:utils, package:datasets, 
>> package:methods, Autoloads, package:base
>> 
>> -- 
>> Sincerely,
>>  Andriy
>> 
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>



[Rd] sub and gsub treat \\ incorrectly (PR#13454)
Andriy Miranskyy