forvalues — 循环连续值
Description
forvalues重复地将 local 宏 lname 设置的 range 内的每个元素,执行括在大括号中的命令。 循环执行零次或多次。
Syntax
forvalues lname = range {
Stata commands referring to `lname'
}
range 的定义
#1(#d)#2: 意思是循环从#1到#2,步长为 d 。
#1/#2: 意思是循环从#1到#2,步长为1 。
#1 #t to #2: 意思是循环从#1到#2,步长为#t - #1。
#1 #t : #2: 意思是循环从#1到#2,步长为#t - #1。
当#d> 0,只要 “lname” 的值为<#2,就会执行循环。
必须使用 forvalues 指定大括号,并且
1. 开大括号必须出现在与 forvalues 相同的行中;
2. 任何东西都不能跟随开括号;要执行的第一个命令必须出现在新的一行上;
3. 闭开大括号必须单独出现在一行。
Remarks and examples
forvalues 是为 lname 的不同数值执行代码块的最快方法。
Example 1
使用 forvalues lname = #1(#d)#2 , 循环执行零次或多次,第一次 执行for lname =#1 , 接着一次执行 for lname = #1 + #d , 再接着一次执行 for lname = #1 + #d + #d ,等等, 只要 lname ≤ #2 假设#d是正数) 或者 只要 lname ≥ #2 (假设#d是负数)。另外,将#d指定为0是错误。
forvalues i = 1(1)5 {
display ‘i’
}
image.png
列出数字1-5,步长为1
forvalues i = 10(-2)1 {
display ‘i’
}
image.png
列出从10开始的数字,逐步减少2直到达到2。它停在2而不是1或0。
forvalues i = 1(1)1 {
display ‘i’
}
结果显示1
forvalues i = 1(1)0 {
display ‘i’
}
没有显示任何值。
forvalues lname = #1/#2 使用结果与 forvalues lname = #1(1)#2 相同. 使用 / 不允许向后计数,也就是步长不为负。
Example 2
forvalues i = 1/3 {
display ‘i’
}
image.png
列出了从1到3的三个值,但是
forvalues i = 3/1 {
2. display ‘i’
3. }
没有列出其它内容,是因为使用这种形式的 forvalues 命令只允许步长递增1。 forvalues lname = #1 #t to #2 和 forvalues lname = #1 #t : #2 形式等同于使用 forvalues lname =#1(#d)#2, 此时#d = #t − #1,也就是说前面两者形式的步长都是 #t − #1
Example 3
forvalues i = 5 10 : 25 {
display ‘i’
}
image.png
forvalues i = 25 20 to 5 {
display ‘i’
}
image.png
Technical note
下面输入语法是错误的。
scalar x = 3
forvalues i = 1(1)‘x’ {
local x = ‘x’ + 1
display ‘i’
}
forvalues 需要循环字符串和数字时。 允许使用宏,如以下技术说明所示。
Technical note
循环 range 的值是第一次执行循环时确定的。更改循环range 将不起作用。 例如
local n 3
forvalues i = 1(1)`n' {
local n = `n' + 1
display `i'
}
image.png
不会创建无限循环。 当'n'最初等于3时,循环将执行3次。
同样,修改循环计数器不会影响 forvalues 的后续行为。 例如
forvalues i = 1(1)3 {
display "Top of loop i = `i'"
local i =`i'* 4
display "After change i = `i'"
}
image.png
仍将执行3次,在每次迭代开始时将 `i' 设置为1,2和3。