[R] replace "%" with "\%"

Wacek Kusnierczyk Waclaw.Marcin.Kusnierczyk at idi.ntnu.no
Fri May 15 18:11:38 CEST 2009


Marc Schwartz wrote:
>
> On May 15, 2009, at 9:46 AM, Liviu Andronic wrote:
>
>> Dear all,
>> I'm trying to gsub() "%" with "\%" with no obvious success.
>>> temp1 <- c("mean", "sd",   "0%",   "25%",  "50%",  "75%",  "100%")
>>> temp1
>> [1] "mean" "sd"   "0%"   "25%"  "50%"  "75%"  "100%"
>>> gsub("%", "\%", temp1, fixed=TRUE)
>> [1] "mean" "sd"   "0%"   "25%"  "50%"  "75%"  "100%"
>> Warning messages:
>> 1: '\%' is an unrecognized escape in a character string
>> 2: unrecognized escape removed from "\%"
>>
>> I am not quite sure on how to deal with this error message. I tried
>> the following
>>> gsub("%", "\\%", temp1, fixed=TRUE)
>> [1] "mean"   "sd"     "0\\%"   "25\\%"  "50\\%"  "75\\%"  "100\\%"
>>
>> Could anyone suggest how to obtain output similar to:
>> [1] "mean"   "sd"     "0\%"   "25\%"  "50\%"  "75\%"  "100\%"
>>
>> Thank you,
>> Liviu
>
> Presuming that you might want to output the results to a TeX file for
> subsequent processing, where the '%' would otherwise be a comment
> character, the key is not to get a single '\', but a double '\\', so
> that you then get a single '\' on output:
>
> temp1 <- c("mean", "sd",   "0%",   "25%",  "50%",  "75%",  "100%")
>
> temp2 <- gsub("%", "\\\\%", temp1)
>
> > temp2
> [1] "mean"   "sd"     "0\\%"   "25\\%"  "50\\%"  "75\\%"  "100\\%"
>
> > cat(temp2)
> mean sd 0\% 25\% 50\% 75\% 100\%
>
>
> Remember that the single '\' is an escape character, which needs to be
> doubled.
>

this confusing "backslash each backslashing backslash" scheme is
idiosyncratic to r;  in many cases where one'd otherwise use a single
backslash in a regex or a replacement string in another programming
language, in r you have to double it.

and actually, in this case you don't need four backslashes.  the
original poster has actually had a valid solution, but he wasn't aware
that the string "\\%", returned (not printed) by gsub includes two, not
three characters --  thus only one backslash, not two:

    cat(
        gsub(
            pattern='%',
            replacement='\\%',
            x='foo % bar',
            fixed=TRUE))
    # foo \% bar

of course, if the pattern cannot be fixed, i.e., fixed=TRUE is less than
helpful, you'd need four backslashes in the replacement -- a cute,
though somewhat disturbing, weirdo.

vQ




More information about the R-help mailing list