2017-09-16 28 views
-2

运行下面的代码无效的名称时,运行执行File

foreach i in 2008 2009 2010 2011{ 
disp `"Working in Year `i'"' 
tostring `i', local(yearStr) 
disp `"yearStr"' 
graph bar E if Year=="'i'", c(1) name ('i',replace) 
histogram E if Year=="`i'", c(1) name (`yearStr',replace) 
} 

我所试图做的是积多年和“E”之间的图巴通过选择2008年的时候我收到“无效的名称” 2009 2010 2011从我已经输入的数据集。但是每当我尝试运行代码时,都会发现相同的错误。

错误:

Working on year 2008 
2008 invalid name 
r(198); 
+1

-1由于缺乏研究。你的一些语法是幻想语法。编码时,您需要更仔细地研究文档。 –

+2

不要破坏你的帖子。 – Undo

回答

1

存在几个误区和误解在这里。

由于tostring需要变量名,因此您的代码在tostring 2008上失败。 tostring也不支持local()选项,但Stata没有那么好。但是,这里根本不需要字符串转换。宏的一个字符串。

您的代码可以改写为

forval i = 2008/2011 { 
    graph bar E if Year == "`i'", subtitle(`i') name(B`i', replace) 
    histogram E if Year == "`i'", subtitle(`i') name(H`i',replace) 
} 

出现的一些细节:

  1. 警告。为此,Year必须是一个字符串变量,在其他地方听起来并不有用。 Year会更好,因为数字。

  2. 语法。我将宏标点更正为不同的左右引号。

  3. 语法。我删掉了选项c(1)。你期望做什么?我知道没有这样的相关选项。也许你想连接一条线,这将是c(l),除非这些命令不起作用。

  4. 风格。您的代码的目的似乎是采取宏i的内容并将其放入另一个宏yearStr。没有必要这样做。

  5. 语法。如果没有空格,最好提供name(),纯数字不能是合法的图表名称。

  6. 意图。在您的代码中,宏iyearStr将具有相同的内容,您无意尝试(例如)创建名称为2008的图并覆盖它,因为下一个图具有相同的名称。如上所述,语法无论如何都是非法的,但只有不同的名称才具有任何意义。

  7. 图形样式。最好把每年的图表文字放在每张图上,以解释每一个显示的内容。

  8. 意图。行di "yearStr"只会显示文字yearStr。它不会显示具有该名称的本地宏。 (我简化了复合双引号。)

所有这一切说,凭借四十年

,你可能会与

graph bar E, by(Year) 
histogram E, by(Year) 

更好但是,如果是E每年只有一个值,你可能需要更多的东西一样

twoway bar E year, base(0) 
相关问题