Bookmark and Share

Notice: On March 31, it was announced that Statalist is moving from an email list to a forum. The old list will shut down on April 23, and its replacement, statalist.org is already up and running.


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: st: Macros in -listtab- header: syntax error


From   Friedrich Huebler <fhuebler@gmail.com>
To   statalist@hsphsun2.harvard.edu
Subject   Re: st: Macros in -listtab- header: syntax error
Date   Thu, 22 Nov 2012 16:14:09 -0500

Roger,

I see now that the line that you mentioned may be interpreted by Stata
as containing an unmatched ` character.

  local bgrades "`bgrades'Grade `j'`""t""'"

With this command I am trying to combine three separate elements
enclosed in double quotes. The first of those elements ends in a left
single quote (`):

  "`bgrades'Grade `j'`" + "t" + "'"

At the core the problem is that I am trying to create a macro with a
string that includes `t', text that should appear in the string as
such (a left single quote, then a lowercase t, then a right single
quote) instead of being interpreted as a macro. I thought I had
achieved this goal because the content of macro "agrades" is:

  Grade 1`t'Grade 2`t'Grade 3`t'

and the content of macro "bgrades" is:

  Grade 1`t'Grade 2`t'

The two macros combined appear as:

  Grade 1`t'Grade 2`t'Grade 3`t'Grade 1`t'Grade 2`t'

The line above is exactly what I need in the -listtab- command and
there doesn't appear to be an unmatched ` character. For this reason I
am puzzled by the syntax error. As an alternative I tried the line
below, with the left single quote now enclosed in double quotes:

  local bgrades "`bgrades'Grade `j'""`""t""'"

The combined macros look correct:

. di "`agrades'`bgrades'"
Grade 1`t'Grade 2`t'Grade 3`t'Grade 1`t'Grade 2`t'

However, -listtab- still stops with a syntax error.

  = file write __00000B `"`"' _n
invalid syntax

Friedrich


On Thu, Nov 22, 2012 at 2:19 PM, Roger B. Newson
<r.newson@imperial.ac.uk> wrote:
> Your quoted line
>
>
> file write __00000B `"Grade 1`"' _n
>
> appears (to me) to contain an unmatched ` character, immediately following
> the string "Grade 1". This may have originated from your line of code (in
> Step 3)
>
>
>      local bgrades "`bgrades'Grade `j'`""t""'"
>
> which seems to me to contain an unmatched ` character just after `j' and
> before "". I would expect this to cause some confusion somewhere, especially
> as your unmatched ` is just before a ", and the pair of characters looks
> like a left compound quote.
>
> I hope this helps.
>
> Best wishes
>
> Roger
>
> Roger B Newson BSc MSc DPhil
> Lecturer in Medical Statistics
> Respiratory Epidemiology and Public Health Group
> National Heart and Lung Institute
> Imperial College London
> Royal Brompton Campus
> Room 33, Emmanuel Kaye Building
> 1B Manresa Road
> London SW3 6LR
> UNITED KINGDOM
> Tel: +44 (0)20 7352 8121 ext 3381
> Fax: +44 (0)20 7351 8322
> Email: r.newson@imperial.ac.uk
> Web page: http://www.imperial.ac.uk/nhli/r.newson/
> Departmental Web page:
> http://www1.imperial.ac.uk/medicine/about/divisions/nhli/respiration/popgenetics/reph/
>
> Opinions expressed are those of the author, not of the institution.
>
>
> On 22/11/2012 17:26, Friedrich Huebler wrote:
>>
>> I use Stata 11.2 with Windows 7 and would like to create a
>> tab-delimited text file similar to the one below.
>>
>> Level A                    Level B           Sum
>> Grade 1  Grade 2  Grade 3  Grade 1  Grade 2
>> 24.7     24.7     24.7     17.6     17.6     109.3
>> 26.2     26.2     26.2     23.4     23.4     125.5
>>
>> For this purpose I use the -listtab- Stata add-on by Roger Newson (see
>> -ssc d listtab-). The data is organized by level and grade, and the
>> number of grades per level varies. To automate the creation of the
>> table header I would like to use macros. When I include the macros in
>> the -listtab- command, Stata aborts with an "invalid syntax" error. I
>> don't know if this is due to the way I create the macros (e.g. the
>> combination of single and double quotes) or if this is a problem with
>> -listtab-.
>>
>> The problem can be demonstrated with the commands below. Step 1
>> creates a meaningless test dataset that mimics the structure of my
>> original data. Step 2 creates a tab-delimited text file in the desired
>> format; here, the table header is specified manually in the -listtab-
>> command. Step 3 is an attempt to automate the creation of the second
>> row in the table header; the number of grades per level is unknown but
>> is not greater than 8, hence the loop over the numbers 1 to 8. Step 4
>> is the -listtab- command that fails with a syntax error.
>>
>> Please note that the macros "agrades" and "bgrades", shown with the
>> -di- command at the end of Step 3, contain the same text as the table
>> header in Step 2:
>>
>> Grade 1`t'Grade 2`t'Grade 3`t'Grade 1`t'Grade 2`t'
>>
>> -set trace on- reveals that the error occurs after the following line
>> but I don't know how to interpret this information:
>>
>>    = file write __00000B `"Grade 1`"' _n
>> invalid syntax
>> r(198);
>>
>> Thank you for your help,
>>
>> Friedrich
>>
>>
>> * Step 1: Test dataset
>> sysuse auto, clear
>> forval i = 1/3 {
>>    gen a`i' = mpg if trunk<13
>> }
>> forval i = 4/5 {
>>    gen b`i' = mpg if trunk>=13
>> }
>> collapse a1 - b5, by(foreign)
>> egen sum = rowtotal(a1 - b5)
>> format a1 - sum %5.1f
>>
>> * Step 2: -listtab- table without syntax error
>> * Tab character for -listtab- header
>> local t = char(9)
>> * Tab-delimited text file
>> #delimit ;
>> listtab a1 - sum using "table1.txt",
>>    head("Level A`t'`t'`t'Level B`t'`t'Sum"
>>         "Grade 1`t'Grade 2`t'Grade 3`t'Grade 1`t'Grade 2`t'")
>>    rstyle(tabdelim) replace
>> ;
>> #delimit cr
>>
>> * Step 3: Create entries for a and b variables in table header
>> * Entry for a variables
>> local agrades ""
>> local j = 1
>> forval i = 1/8 {
>>    capture confirm variable a`i'
>>    if !_rc {
>>      local agrades "`agrades'Grade `j'`""t""'"
>>      local j = `j' + 1
>>    }
>> }
>> * Entry for b variables
>> local bgrades ""
>> local j = 1
>> forval i = 1/8 {
>>    capture confirm variable b`i'
>>    if !_rc {
>>      local bgrades "`bgrades'Grade `j'`""t""'"
>>      local j = `j' + 1
>>    }
>> }
>> * Show macros with table header entries
>> di "`agrades'`bgrades'"
>>
>> * Step 4: -listtab- table with syntax error
>> * Tab character for -listtab- header
>> local t = char(9)
>> * Tab-delimited text file
>> #delimit ;
>> listtab a1 - sum using "table2.txt",
>>    head("Level A`t'`t'`t'Level B`t'`t'Sum"
>>         "`agrades'`bgrades'")
>>    rstyle(tabdelim) replace
>> ;
>> #delimit cr
*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/faqs/resources/statalist-faq/
*   http://www.ats.ucla.edu/stat/stata/


© Copyright 1996–2014 StataCorp LP   |   Terms of use   |   Privacy   |   Contact us   |   Site index