Solution for "Exercise: Parameters"ΒΆ
1. Create a copy of SConstruct-parameters-isles and rename it SConstruct-parameters-all.
2. Add cmd_last_data and cmd_abyss_data in SConstruct-parameters-all using countWords.do as a source with parameters.
Add params='"inputfilesName"' in SConstruct-parameters-solutions.
cmd_abyss_data = env.StataBuild(
target = 'outputs/data/dta/abyss.dta',
source = 'code/countWords.do',
params='"abyss"')
Depends=(cmd_abyss_data,
['inputs/txt/abyss.txt']
)
cmd_last_data = env.StataBuild(
target = 'outputs/data/dta/last.dta',
source = 'code/countWords.do',
params='"last"')
Depends=(cmd_last_data,
['inputs/txt/last.txt']
)
2. Change textZipf.do to textZipfArg.do that takes the input file names as arguments.
Instead of updating testZipf.do, we can make testZipfArgs.do, a version of testZipf.do which takes the input file names as arguments. Then, we can call it with parameters.
a. Copy testZipf.do and rename it testZipfArgs.do
b. Open testZipfArgs.do in Stata do-file editor and edit the first part of do-file. Include args inputFiles and remove the local inputFiles variable list.
args inputFiles
// local inputFiles isles last abyss
Sample do-file:
. type code/testZipfArgs.do
version 16.1
quietly include profile.do
args inputFiles
//local inputFiles
noi di `"local inputFiles: "`inputFiles'" "'
foreach file of local inputFiles {
cap confirm file "outputs/data/dta/`file'.dta"
if _rc==0 {
local LoopOver `LoopOver' `file'
}
}
noi di `"local LoopOver: "`LoopOver'" "'
preserve
// set up tempfile
tempname myName
tempfile myFile
postfile `myName' str100(Book) long(First Second) using `myFile'
foreach inputFile of local LoopOver {
use outputs/data/dta/`inputFile'.dta, clear
keep freq
gsort - freq
keep in 1/2
post `myName' ("`inputFile'") (freq[1]) (freq[2])
}
postclose `myName'
use `myFile', clear
gen Ratio = First / Second
format Ratio %4.3f
compress
save outputs/data/dta/testZipf.dta, replace
export delimited using outputs/tables/testZipf.txt, ///
delimiter(tab) replace
restore
3. Add a rule in our new SConstruct to build new textZpif.txt.
Update SConstruct-parameters-all to apply our new rules using parameters.
Include params='"isles last abyss"' in cmd_results and outputs/data/dta/abyss.dta','outputs/data/dta/last.dta' in depends.
cmd_results = env.StataBuild(
target = 'outputs/tables/testZipf.txt',
source = 'code/testZipfArgs.do',
params='"isles last abyss"'
)
Depends = (cmd_results,
['outputs/data/dta/isles.dta',
'outputs/data/dta/abyss.dta',
'outputs/data/dta/last.dta',]
)
4. Use SConstruct-parameters-all to see if any of the targets need to be rebuilt.
Clear your output/dta directory before running if the outputs already exist.
. statacons, file(SConstruct-parameters-all) clean
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Cleaning targets ...
Removed outputs\data\dta\abyss.dta
Removed outputs\data\dta\isles.dta
Removed outputs\data\dta\last.dta
Removed outputs\tables\testZipf.txt
scons: done cleaning targets.
. statacons, file(SConstruct-parameters-all)
scons: Reading SConscript files ...
Using 'LabelsFormatsOnly' custom_datasignature.
Calculates timestamp-independent checksum of dataset,
including variable formats, variable labels and value labels.
Edit use_custom_datasignature in config_project.ini to change.
(other options are Strict, DataOnly, False)
scons: done reading SConscript files.
scons: Building targets ...
stata_run(["outputs\data\dta\abyss.dta"], ["code\countWords.do"])
Running: "C:\Program Files\Stata16\StataMP-64.exe" /e do "code\countWords.do" "
> abyss". log=countWords-8e4bf7a2.log.
Starting in hidden desktop (pid=21300).
stata_run(["outputs\data\dta\isles.dta"], ["code\countWords.do"])
Running: "C:\Program Files\Stata16\StataMP-64.exe" /e do "code\countWords.do" "
> isles". log=countWords-fad1dc5c.log.
Starting in hidden desktop (pid=15908).
stata_run(["outputs\data\dta\last.dta"], ["code\countWords.do"])
Running: "C:\Program Files\Stata16\StataMP-64.exe" /e do "code\countWords.do" "
> last". log=countWords-3cf895f1.log.
Starting in hidden desktop (pid=5180).
stata_run(["outputs\tables\testZipf.txt"], ["code\testZipfArgs.do"])
Running: "C:\Program Files\Stata16\StataMP-64.exe" /e do "code\testZipfArgs.do"
> "isles last abyss". log=testZipfArgs-b47d1d91.log.
Starting in hidden desktop (pid=23380).
scons: done building targets.
. type outputs/tables/testZipf.txt
Book First Second Ratio
isles 3315 2185 1.5171624
last 10684 4904 2.1786296
abyss 3538 2524 1.4017433
.
Note: statacons and SConstruct file allow us to create abyss.dta and last.dta without editing the Stata do-file.