2016-02-09 4 views
2

Я восстанавливаю Stata после обновления Windows. У меня есть список моих пакетов генерируемый из ado dir в следующем формате:Переустановка пакетов из списка, сгенерированного командой: ado dir

[1] пакет mdesc из http://fmwww.bc.edu/RePEc/bocode/m «MDESC»: модуль для табулирования распространенности пропущенных значений

[2] пакет Univar из http://fmwww.bc.edu/RePEc/bocode/u «UNIVAR»: модуль для генерации одномерного сводного отчета с полем «ящик и усы»

[3] упаковка tabmiss от http://www.ats.ucla.edu/stat/stata/ado/analysis tabmiss. Показывает таблицу количества отсутствующих и не пропущенных значений

У меня есть много пакетов и вы хотите переустановить их, не указывая каждый каталог/URL-адрес через net cd. Хотя использование net cd вместе с net install или ssc 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' 
     } 
+0

Я не вижу причин, по которым переустановленная Stata должна в любом случае знать, какие пользовательские пакеты, которые вы установили ранее, не больше, чем Stata на одной машине, знали бы, что установлено на другом. Что более важно, почему обновление Windows повлияет на вашу установку Stata? –

+0

Моя машина была повторно обработана после заражения вирусом корневого каталога. Проницательный член нашей ИТ-команды получил результат «ado dir» до вытирания машины и обновления до Windows 10. STATA была переустановлена ​​с диска. Я не предполагаю, что STATA должен иметь память пакетов, но хотел бы понять, есть ли способ переустановки с учетом списка, предоставленного «ado dir». – Todd

+0

Итак, машина была вытерта. Я согласен с ответом @ ander2ed. Обратите внимание, что орфография - это Stata, а не STATA. –

ответ

2

Насколько мне известно, нет встроенного или автоматизированный способ отслеживания и управления установленных пакетов за пределами того, что доступно через ado или net.

Я бы тоже согласился с @Nick Cox, что эта задача кажется странной, и я не могу себе представить, как новая установка или переустановка Stata могла бы знать, что было установлено ранее, но я нахожу этот вопрос интересным по другим причинам.

Основная причина, по которой пользователи, имеющие Stata, установлены на нескольких машинах, которым нужны те же пакеты на обеих машинах. Я столкнулся с аналогичной проблемой, когда приобрел новый компьютер и установил Stata, но хотел, чтобы все пакеты, которые я использую, были доступны. Вне перемещения каталога ado или выбранного содержимого я не знаю о каком-либо быстром решении.

Здесь можно будет использовать вывод ado dir на одной машине, чтобы определить, что вам нужно установить на второй машине с новой установкой Stata.

Метод, который вы предлагаете с помощью цикла foreach, может сэкономить ваше время, если вам придется вводить или копировать/вставлять множество пакетов и URL-адресов. В то же время это полезно только в том случае, если у вас есть много пакетов из нескольких репозиториев, потому что вам нужно будет указывать net cd на URL-адрес каждый раз, как вы показываете в своем примере.

Альтернативное решение - это программное решение. Как вы знаете, ado dir перечисляет каждый установленный пакет, URL-адрес и краткое описание пакета. Используя это, файл журнала и встроенные функции ввода-вывода, можно записать короткую программу для автоматизации процесса и динамической сборки файла do, который содержит команды для установки уже установленных пакетов.

В приведенном ниже коде создается файл do, содержащий команды (в данном случае net describe package, from(url)) для каждого пакета, который я установил на свой компьютер.

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.

Выше цикла, я создаю файл do на /path/to/your/dofile.do, чтобы удерживать вывод цикла - динамически созданные команды, относящиеся к установленным пакетам на моей машине.

Петля будет проходить до тех пор, пока r(eof) = 0, где r(eof) - это маркер файла. Я использую оператор if для сортировки строк файла журнала, содержащих пакет слов, поскольку меня интересуют только те строки с именем пакета и URL-адресом в них.

Внутри блока if я разбираю локальный макрос line, чтобы вытащить имя пакета и имя URL/каталога.

это важно: этот раздел кода предполагает, что 3 и 5 слов в макросе всегда будет имя пакета и URL соответственно - Подтвердите с выходаado dirперед выполнением.

Вам также потребуется изменить команду, которая записывается в дескриптор файла dfh внутри цикла, на то, что вы хотите (net install и т. Д.), Когда вы готовы выполнить.

Для получения дополнительной помощи по использованию file, local с, и tempfile s выполнить одно из следующих действий в Stata:

help file   
help extended_fcn 
help macrolists 

Там может быть приятнее способа разобрать содержимое ado dir, но это работает для меня. И, конечно же, я всегда советовал, чтобы вы нашли время, чтобы понять, что делает код, чтобы вы могли делать любые необходимые настройки в соответствии с вашей конкретной ситуацией.