[Rd] [R] shQuote and cat

Simon Urbanek simon.urbanek at r-project.org
Thu Jul 24 03:08:58 CEST 2008

On Jul 23, 2008, at 4:46 PM, Vadim Organovich wrote:

> It is precizely a shell command that I am trying to generate. To be  
> specific let's try to have R 'output' the following shell command:  
> 'echo "\"a\""'. This is is a valid command, at least in bash:
> bash-3.2$ echo "\"a\""
> "a"
> Now in R:
>> x <- 'echo "\"a\""'
>> cat(x, '\n')
> echo ""a""
>> cat(shQuote(x), '\n')
> "echo \"\"a\"\""
> Whichever way you do it it is not right.

Well, you input is not right ('\"' is parsed in R into '"') - you have  
to escape the backslash that you want to keep and all is well:

 > x <- 'echo "\\"a\\""'
 > cat(x, '\n')
echo "\"a\""
 > cat(shQuote(x), '\n')
'echo "\"a\""'
 > system(paste("sh -c",shQuote(x,type="sh")))


> Again I think cat('echo "\"a\""') should be printing *echo "\"a\""*  
> (asterics are not a part of the output)
> ________________________________________
> From: Duncan Murdoch [murdoch at stats.uwo.ca]
> Sent: Wednesday, July 23, 2008 2:38 PM
> To: Vadim Organovich
> Cc: r-devel at r-project.org
> Subject: Re: [Rd] [R] shQuote and cat
> On 7/23/2008 2:53 PM, Vadim Organovich wrote:
>> I feel like it now belongs to r-devel more than to r-help.
>> My output was garbled because I sent the original message as HTML,  
>> sorry about that.
>> Your output, "\"\\"a\\"\"", is what I get too. That is
>>> cat(shQuote(shQuote(shQuote("a"))), '\n')
>> "\"\\"a\\"\""
>> , which I think should be "\"\\\"a\\\"\"".
>> Actually, the R's output, "\"\\"a\\"\"", is not even a valid string  
>> literal, that is
>>> x <- "\"\\"a\\"\""
>> fails.
> It's not intended to be a string literal in R, it's intended to be  
> input
> to the Windows CMD shell.  If you want a string literal in R, don't  
> use
> cat().  cat() shows you the naked contents of the string without any
> quoting to make it a valid string literal.
>> Now, by cat() being the inverse of shQuote() I mean printing the  
>> same literal as it goes into shQuote, quotes included:
>>> cat(shQuote("a"), '\n')
>> "a"
>> whereas
>>> cat("a", '\n')
>> a  ## no quotes
>> If cat() is not the inverse of shQuote() in the above sense, what is?
> On Unix-like systems I think asking the shell to echo the output, i.e.
> system(paste("echo", shQuote(input)), intern=TRUE)
> is intended to reproduce the input.  However, the Windows CMD shell is
> different.  I don't know how to strip quotes off a string in it,  
> e.g. I see
> C:\WINDOWS\system32 echo "a"
> "a"
> Nevertheless, the quotes *are* necessary when passing filenames to
> commands, and they'll typically be stripped off when doing that, e.g.
> echo hi >"a"
> will create a file named a, not named "a", and
> echo hi >"a b"
> will create a file with a space in the name.
> Duncan Murdoch
> Note: This email is for the confidential use of the named  
> addressee(s) only and may contain proprietary, confidential or  
> privileged information. If you are not the intended recipient, you  
> are hereby notified that any review, dissemination or copying of  
> this email is strictly prohibited, and to please notify the sender  
> immediately and destroy this email and any attachments.  Email  
> transmission cannot be guaranteed to be secure or error-free.  Jump  
> Trading, therefore, does not make any guarantees as to the  
> completeness or accuracy of this email or any attachments.  This  
> email is for informational purposes only and does not constitute a  
> recommendation, offer, request or solicitation of any kind to buy,  
> sell, subscribe, redeem or perform any type of transaction of a  
> financial product.
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

More information about the R-devel mailing list