## Wednesday, January 30, 2013

### Return Text

do file

* The following program will create a tiny program that will send to the display input text.
cap program drop rt
program define rt
local caller : di _caller()
* This will parse the 0' text so that there is a before the colon and an after the colon
capt _on_colon_parse 0'

* This will save the after the colon in the macro s(after)
local command = s(after)

* Now we will display the command input
di as input "command'"'

* Next we will run the command.
command'
end

rt: clear
rt: set obs 1000
rt: gen a = "324"
rt: sum

* Without rt the following commands will see only the output.
forv i = 1/5 {
clear
set obs i'000
gen a = rnormal()
sum
}

* With rt prefix we will see both the command as well as the output.
forv i = 1/5 {
rt: clear
rt: set obs i'000
rt: gen a = rnormal()
rt: sum
}

#### 1 comment:

1. Useful command! One comment: I think -local command = s(after)- should be -local command "s(after)'"-. [R] saved results reads:

"Say that some command set r(scalar) and r(macro), the first being stored as a scalar and the second as a macro. ... For r(macro), you are supposed to refer to it in quotes: `r(macro)'. If, however, you omit the quotes in an expression context, Stata evaluates the macro and then pretends that it is the result of function-returning-string. There are side effects of this, the most important being that the result is trimmed to 80 characters. Referring to r(macro) without quotes is never a good idea; the feature was included merely for
completeness."

I don't know what this 80 characters is about: I think the limit is closer to 244 characters. But there is some limit, and it'll bite for long commands. Here's a modified example from -help line-:

sysuse uslifeexp, clear
generate diff = le_wm - le_bm
rt: line le_wm year, yaxis(1 2) xaxis(1 2) || line le_bm year || line diff year || lfit diff year ||, ylabel(0(5)20, axis(2) gmin angle(horizontal)) ylabel(0 20(10)80, gmax angle(horizontal)) ytitle("", axis(2)) xlabel(1918, axis(2)) xtitle("", axis(2))