从命令生成的列表中重新安装软件包:ado dir

Reinstalling packages from a list generated by command: ado dir

我正在 Windows 升级后恢复 Stata。我有一个从 ado dir 生成的包列表,格式如下:

[1] 来自 http://fmwww.bc.edu/RePEc/bocode/m 的软件包 mdesc 'MDESC':用于统计缺失值发生率的模块

[2] 来自 http://fmwww.bc.edu/RePEc/bocode/u 的包 univar 'UNIVAR':使用盒须图生成单变量摘要的模块

[3] 包 tabmiss 来自 http://www.ats.ucla.edu/stat/stata/ado/analysis 报错。显示缺失值和非缺失值数量的列表

我有很多软件包,想重新安装它们而不必通过 net cd 指定每个 directory/url。虽然在循环中将 net cdnet installssc install 与包名称一起使用是微不足道的(如下所示),但似乎可以使用此任务的自动化方法。

net cd http://www.ats.ucla.edu/stat/stata/ado/analysis
    local ucla tabmiss csgof powerlog ldfbeta 
        foreach x of local ucla {
            net install `x'
        }

据我所知,除了通过 adonet.

提供的功能之外,没有内置或自动的方法来跟踪和管理已安装的软件包

我也倾向于同意@Nick Cox 的观点,即这个任务看起来很奇怪,我无法想象新的 Stata 安装或重新安装如何知道以前安装了什么,但我发现这个问题出于其他原因很有趣。

主要原因是在多台机器上安装了 Stata 的用户需要在两台机器上使用相同的软件包。当我购买一台新计算机并安装 Stata 但希望我使用的所有软件包也可用时,我遇到了类似的问题。除了移动 ado 目录或选定的内容之外,我不知道有任何快速解决方案。

这里可以在一台机器上使用 ado dir 的输出来确定您需要在第二台机器上安装新的 Stata 安装的内容。

您建议使用 foreach 循环的方法可以节省您输入或 copy/paste 大量包和 URL 的时间。然而,与此同时,这只有在您只有几个存储库中有许多包时才有用,因为您每次都需要 net cd 到 URL,如您在示例中所示。

另一种解决方案是编程解决方案。如您所知,ado dir 将列出每个已安装的包,URL 和包的简短描述。使用它、一个日志文件和内置的 I/O 功能,可以编写一个简短的程序来自动执行该过程并动态构建一个包含安装已安装软件包的命令的 do 文件。

下面的代码为我在计算机上安装的每个包生成一个包含命令(在本例中为 net describe package, from(url))的 do 文件。

clear *

tempfile log1
log using "`log1'", text name(mylog)
ado dir
log close mylog

tempname logfile
file open `logfile' using "`log1'", read
file read `logfile' line

file open dfh using "path/to/your/dofile.do", write replace

local pckage "package"

while r(eof) == 0 {
    if `: list pckage in line' {

        local packageName : word 3 of `line'
        local dirName : word 5 of `line'
        di "`packageName' `dirName'"

        file write dfh "net describe `packageName', from(`dirName')"
        file write dfh _newline

    }
    file read `logfile' line
}

file close `logfile'
file close dfh

在上面的代码中,我创建了一个临时文件来写入 .txt 日志文件并将 ado dir 的内容存储在该文件中。

然后,我使用 file open 打开日志文件并在 while 循环中逐行读取它。

在循环之上,我在 /path/to/your/dofile.do 创建一个 do 文件来保存循环的输出——与我机器上安装的包相关的动态创建的命令。

只要 r(eof) = 0,循环就会重复,其中 r(eof) 是文件结束标记。我使用 if 语句来整理日志文件中包含单词 package 的行,因为我只对那些包含包名称和其中 URL 的行感兴趣。

if 块内,我解析本地宏 line 以提取包名称和 URL/directory 名称。

这很重要:这部分代码假定宏中的第 3 个和第 5 个词将始终分别是包名称和 URL - 从 [= 的输出中确认这一点68=] ado dir 执行前.

当您准备好执行时,您还需要将循环内写入文件句柄 dfh 的命令更改为您想要的命令(net install,等等)。

有关使用 filelocals 和 tempfiles 的更多帮助,请在 Stata 中执行以下任一操作:

help file          
help extended_fcn 
help macrolists

可能有更好的方法来解析 ado dir 的内容,但这对我有用。当然,我总是建议您花时间了解代码的作用,以便您可以进行任何必要的调整以适应您的特定情况。