[R] How do I paste double quotes arround a character string?

(Ted Harding) Ted.Harding at manchester.ac.uk
Thu Jul 3 15:03:47 CEST 2008


I agree with Brian Ripley's suggestions

unix.cmd<-paste( "cut -d -f" , col.pos  , " " , fn  , sep = '')
gnu.dat <- read.csv(pipe(unix.cmd))

It is the same conclusion as I came to myself, after reading your
"correction to small typo" message. In short, no quotes are needed
by the Unix shell in the command you want it to execute. The
quotes are only needed to identify, to R, arguments in the paste()
function as character strings. R then constructs unix.cmd as a
string, and passes the characters in that string (without bounding
quotes) as a command line to Unix just as if you had typed it yourself
at a shell prompt.

On the other hand, if the Unix command itself had needed quotes
(as in the example ls -l "New Mexico" I used), then you should
put them in with \". As in (now getting closer to the usage you
intend):

  unix.cmd <- paste("ls -l", "\"New Mexico\"")
  unix.cmd
# [1] "ls -l \"New Mexico\""
  read.table(pipe(unix.cmd))
#           V1 V2  V3  V4 V5         V6    V7  V8     V9
# 1 -rw-r--r--  1 ted ted  0 2008-07-03 11:58 New Mexico

which is OK.

By trying to enclose the Unix command itself in quotes, you
would in effect be giving Unix a command line (including the
quotes) like:

  "ls -l New*"

which has the effect:

ted at deb:~$ "ls -l New*"
bash: ls -l New*: command not found

In other words, it was looking for a command whose name was,
literally, 'ls -l New*' and, of course, not finding it.

Hoping things are a bit clearer now!
Ted.

On 03-Jul-08 11:13:42, Prof Brian Ripley wrote:
> On Thu, 3 Jul 2008, Philip James Smith wrote:
> 
>> He Ted:
>>
>> My command will look like:
>>
>> gnu.dat <- read.csv( pipe( "cut -d, 
>> -f9,2669,2676,2684,506,467,423,6,16,622,474,2,403,19,436,400,444,430,39
>> 0,2671,437,428,2686,23,21,2246,2326,2288,2282,2272,2360,2318,2262,476,5
>> 02,605,519,523,527,531,535 
>> /home/philipsmith/file_name.csv" ) )
>>
>> This code uses pipe() and the unix command "cut."
>>
>> What I'm trying to do is to read certain fields in a .csv file..... my
>> original .csv file has THOUSANDS of columns, so I just want to read
>> certain 
>> ones...The unix command "cut" uses -d to specify that  the comma ","
>> is the 
>> delimiter in the file, and the -f to identify the field numbers. After
>> the 
>> field numbers "cut" wants the file name.
>>
>> Evidently, the unix command called by pipe must be within double
>> quotes... 
>> and that is my problem...
> 
> That is not 'evident', not even true in your example.  You passed
> pipe() a 
> length-one character vector containing a command, and the quotes were 
> something the parser used to recognize the element of the character 
> vector.
> 
>>
>> In my actual problem, I've got THOUSANDS of csv files that contain
>> some 
>> common variables and other variables that differ from file to file.
>> I've 
>> specified the variables I want as a character vector called namz, and
>> read 
>> the first line of each file using scan(). I'm then able to find out
>> using 
>> match() the positions of the variables I want in each file. the code
>> listed 
>> above gives only 1 of THOUSANDS of possible configurations of those
>> desired 
>> variables.
>>
>> In order to get this task done, for each file I get the position
>> numbers in a 
>> variable called "col.pos" and then create the unix command using
>> paste:
>>
>>
>> unix.cmd    <-    paste( "cut -d -f" , col.pos  , " " , fn  , sep = ''
>> )
> 
> and then you can use
> 
> gnu.dat <- read.csv(pipe(unix.cmd))
> 
> Much simpler!
> 
>> Then what I want to do is to create the R command that will read the
>> file... 
>> something like:
>>
>>
>> cmd0        <-     paste(  "gnu.dat <- read.csv( pipe ( \"" , 
>> unix.cmd , 
>> "\" ) ) " , sep='')
>>
>>
>> Then, I'll use
>>
>> eval( parse (text = cmd0) )
>>
>> to read a file... and embed this in more code to read all of the
>> THOUSANDS of 
>> files, each 1 at a time.
>>
>> However, in the "cmd0" variable, I've used "\"" ... this does not
>> work... it 
>> yields a character string that looks like...
>>
>>
>>> cmd0
>> [1] "gnu.dat <- read.csv( pipe ( \"cut -d 
>> -f9,2669,2676,2684,506,467,423,6,16,622,474,2,403,19,436,400,444,430,39
>> 0,2671,437,428,2686,23,21,2246,2326,2288,2282,2272,2360,2318,2262,476,5
>> 02,605,519,523,527,531,535 
>> /home/philipsmith/Bubba/NIS/2007_claf/y2007.csv\" ) ) "
>>>
>>
>> You'll see in that line the slash that precedes the double quote. the
>> pipe() 
>> command is giving unix a unix command that has a slash in it: unix is 
>> expecting only a double quote and not a slash and gives and error.
>>
>> So, those are all of the details. I'll be quite grateful if you can
>> tell me 
>> how to paste a double quote (") in front of and at the end of a string
>> so 
>> that unix will recognize the string as a valide unix command.
> 
> Actually, this is a shell command line, which the shell parses and
> passes 
> to Unix *provided* the parsing is not switched off by quoting.
> 
> If you want to quote a command string, that is what shQuote() is for.
> 
>>
>> Very gratefully,
>> Phil Smith
>> Duluth, GA
>>
>>
>>
>>
>>
>>
>> (Ted Harding) wrote:
>>> Hi Philip,
>>> I think a bit more clarification may be useful yet!
>>> 
>>> 1: How are you sending the command from R to Linux?
>>> 2: What is the command intended to be (as seen by Linux)?
>>>    And from what source (quasi-command line; script file; ...)
>>>    would it be read by Linux?
>>> 
>>> For example, on my Linux machine, I just did (in a shell
>>> command line):
>>> 
>>> ted at deb:~$ touch "New Mexico"
>>> ted at deb:~$ ls -l "New Mexico"
>>> -rw-r--r-- 1 ted ted 0 2008-07-03 10:58 New Mexico
>>> 
>>> and then, in R, I did:
>>>
>>> 
>>>> system("ls -l \"New Mexico\"")
>>>> 
>>> -rw-r--r-- 1 ted ted 0 2008-07-03 10:58 New Mexico
>>> 
>>> so I don't seem to have had the problem you describe below.
>>> 
>>> On the other hand, back in Linux, if I do:
>>> 
>>> ted at deb:~$ ls -l \"New Mexico\"
>>> ls: "New: No such file or directory
>>> ls: Mexico": No such file or directory
>>> 
>>> which looks like the problem you describe -- so clearly the
>>> command did not get through in that form from R using the
>>> command system("ls -l \"New Mexico\"").
>>> 
>>> Best wishes,
>>> Ted.
>>> 
>>> On 03-Jul-08 09:18:14, Philip James Smith wrote:
>>> 
>>>> Thanks for your reply, Ted... I am very grateful for it.
>>>> 
>>>> Using your notation, what I need is a character string Y that looks
>>>> like:
>>>>
>>>>  >
>>>>  > Y
>>>>  >[1] ""New Mexico""
>>>> 
>>>> rather than
>>>>
>>>>  > Y
>>>>  >[1] "\"New Mexico\""
>>>> 
>>>> i.e., Y must have the string 'New Mexico' surrounded by double
>>>> quotes, 
>>>> rather than double quotes preceded by slashes.
>>>> 
>>>> The reason why I need it that way is that I've over simplified my
>>>> request 
>>>> and the character string is actually a unix command that needs to be
>>>> surrounded by double quotes when embeded in the unix (linux)
>>>> executes it. 
>>>> When unix sees that slash before the quotes, it gives an
>>>> error.
>>>> 
>>>> I'd be grateful if you can provide a solution to this!!
>>>> 
>>>> Thank you, Ted!
>>>> 
>>>> Gratefully,
>>>> Phil Smith
>>>> Duluth, GA
>>>> 
>>>> 
>>>> (Ted Harding) wrote:
>>>> 
>>>>> On 03-Jul-08 01:25:55, Philip James Smith wrote:
>>>>> 
>>>>>> Hi R Community:
>>>>>> I've got a character string that looks like: New Mexico
>>>>>> 
>>>>>> How to I create the new character string that looks like: "New
>>>>>> Mexico" That is, it is the original string (New Mexico)  with
>>>>>> double 
>>>>>> quotes infront and behind it?
>>>>>> 
>>>>>> Thanks,
>>>>>> Phil Smith
>>>>>> 
>>>>> I tried the following. Is that the sort of thing you want to
>>>>> achieve?
>>>>>
>>>>>   X<-"New Mexico"
>>>>>   Y<-"\"New Mexico\""
>>>>>   X
>>>>> # [1] "New Mexico"
>>>>>   Y
>>>>> # [1] "\"New Mexico\""
>>>>>   plot((1:10),xlab=X,ylab=Y)
>>>>> 
>>>>> Best wishes,
>>>>> Ted.
>>>>> 
>>>>> --------------------------------------------------------------------
>>>>> E-Mail: (Ted Harding) <Ted.Harding at manchester.ac.uk>
>>>>> Fax-to-email: +44 (0)870 094 0861
>>>>> Date: 03-Jul-08                                       Time:
>>>>> 09:22:10
>>>>> ------------------------------ XFMail
>>>>> ------------------------------
>>>>> 
>>>>>
>>>>> 
>>>> ______________________________________________
>>>> R-help at r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>>> PLEASE do read the posting guide
>>>> http://www.R-project.org/posting-guide.html
>>>> and provide commented, minimal, self-contained, reproducible code.
>>>> 
>>> 
>>> --------------------------------------------------------------------
>>> E-Mail: (Ted Harding) <Ted.Harding at manchester.ac.uk>
>>> Fax-to-email: +44 (0)870 094 0861
>>> Date: 03-Jul-08                                       Time: 11:08:36
>>> ------------------------------ XFMail ------------------------------
>>> 
>>> 
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
> 
> -- 
> Brian D. Ripley,                  ripley at stats.ox.ac.uk
> Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
> University of Oxford,             Tel:  +44 1865 272861 (self)
> 1 South Parks Road,                     +44 1865 272866 (PA)
> Oxford OX1 3TG, UK                Fax:  +44 1865 272595
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

--------------------------------------------------------------------
E-Mail: (Ted Harding) <Ted.Harding at manchester.ac.uk>
Fax-to-email: +44 (0)870 094 0861
Date: 03-Jul-08                                       Time: 14:03:41
------------------------------ XFMail ------------------------------



More information about the R-help mailing list