replace "%" with "\%"
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