[R] How to convert "c:\a\b" to "c:/a/b"?
Henrik Bengtsson
hb at maths.lth.se
Mon Jun 27 19:29:05 CEST 2005
Spencer Graves wrote:
> Thanks, Dirk, Gabor, Eric:
>
> You all provided appropriate solutions for the stated problem.
> Sadly, I oversimplified the problem I was trying to solve: I copy a
> character string giving a DOS path from MS Windows Explorer into an R
> script file, and I get something like the following:
>
> D:\spencerg\statmtds\R\Rnews
>
> I want to be able to use this in R with its non-R meaning, e.g., in
> readLine, count.fields, read.table, etc., after appending a file name.
> Your three solutions all work for my oversimplified toy example but are
> inadequate for the problem I really want to solve.
Hmmm. It should work as long as you do not source() the file (see
below). There are two things to watch out for here.
First, you have to be careful with backslashes, that is, a backslash is
a single character ('\') in memory, but to be typed at the R prompt, you
have to escape it (with a backslash), which is why we type "\\", cf.
nchar("\\") == 0. Consider the file foo.txt containing the 28
characters (==28 bytes in plain ASCII format)
D:\spencerg\statmtds\R\Rnews
You can create such a file in R by
> cat(file="foo.txt", "D:\\spencerg\\statmtds\\R\\Rnews")
> str(file.info("foo.txt"))
`data.frame': 1 obs. of 6 variables:
$ size : num 28
$ isdir: logi FALSE
$ mode :Class 'octmode' int 438
$ mtime:'POSIXct', format: chr "2005-06-27 19:14:20"
$ ctime:'POSIXct', format: chr "2005-06-27 19:14:20"
$ atime:'POSIXct', format: chr "2005-06-27 19:14:20"
Re-read it into R:
> bfr <- readLines("foo.txt")
Warning message:
incomplete final line found by readLines on 'foo.txt'
> bfr
[1] "D:\\spencerg\\statmtds\\R\\Rnews"
> cat("bfr='", bfr, "'\n", sep="")
bfr='D:\spencerg\statmtds\R\Rnews'
Now, convert backslashes to "forwardslashes":
bfr2 <- gsub("\\\\", "/", bfr)
> bfr2
[1] "D:/spencerg/statmtds/R/Rnews"
> cat("bfr2='", bfr2, "'\n", sep="")
bfr2='D:/spencerg/statmtds/R/Rnews'
Second, regular expression patterns have their own escaping rules. This
is why the following happens:
bfr3 <- gsub("\\", "/", bfr)
Error in gsub(pattern, replacement, x, ignore.case, extended, fixed) :
invalid regular expression '\'
The pattern "\\", which is a single '\' in memory, is passed to gsub().
Then gsub() tries to interpret this single backslash as a pattern, but
it is invalid. gsub() uses backslashed to escape some characters in
patterns. So, when you think what gsub() needs, this about the
characters (bytes) that are really stored in memory, not what you see.
A side comment: Wouldn't it be nice if the R parser had an alternative
way to quote string such that, say, Perl strings could be used? Example:
bfr3 <- gsub("\\\\", "/", bfr)
bfr3 <- gsub('\\', "/", bfr)
would be equal (if now single quotes wouldn't have been reserved already).
Back to your problem: You must not paste the 28 characters into an R
script that you source()! If you want to include you pathname (copied
from the command prompt), you have to escape each '\' with a '\' to
'\\'. Thus, if you use Emacs or another text editor, you pretty much
should see '\\' if you want R(!) to interpret this as the single
character '\'. Note the difference between using source() and, say,
readLines().
Hope this helps
Henrik
> Thanks,
> spencer graves
>
> Gabor Grothendieck wrote:
>
>
>>On 6/27/05, Dirk Eddelbuettel <edd at debian.org> wrote:
>>
>>
>>>On 26 June 2005 at 20:30, Spencer Graves wrote:
>>>| How can one convert back slashes to forward slashes, e.g, changing
>>>| "c:\a\b" to "c:/a/b"? I tried the following:
>>>|
>>>| > gsub("\\\\", "/", "c:\a\b")
>>>| [1] "c:\a\b"
>>>
>>>This does work, provided you remember that single backslashed "don't exist"
>>>as e.g. \a is a character in itself. So use doubles are you should be fine:
>>>
>>>
>>>
>>>>gsub("\\\\", "/", "c:\\a\\b")
>>>
>>>[1] "c:/a/b"
>>>
>>
>>
>>Also, if one finds four backslashes confusing one can avoid the use
>>of four via any of these:
>>
>>gsub("[\\]", "/", "c:\\a\\b")
>>gsub("\\", "/", "c:\\a\\b", fixed = TRUE)
>>chartr("\\", "/", "c:\\a\\b")
>>
>>______________________________________________
>>R-help at stat.math.ethz.ch mailing list
>>https://stat.ethz.ch/mailman/listinfo/r-help
>>PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>
>
More information about the R-help
mailing list