forvalues — 循环连续值

2019-05-01  本文已影响0人  松柏林stata

Description

forvalues重复地将 locallname 设置的 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 #2forvalues 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。

上一篇下一篇

猜你喜欢

热点阅读