Как я могу перечислить пакеты, не включенные ни в одно из представлений задач R?

В последнее время я много просматривал представления задач R и обнаружил, что некоторые интересующие пакеты не включаются ни в какие представления задач. Существует ли установленный способ найти дополнение к пакетам, перечисленным в представлениях задач?

Я понимаю, что через XML и обработку файлов ctv (например, http://cran.r-project.org/web/views/Econometrics.ctv), я могу найти объединение всех пакетов, перечисленных в узле <packagelist>, и этот available.packages() может перечислить все доступные пакеты для загрузки. В этом и есть хитрость, или я упускаю какую-то хитрость при использовании таких сайтов, как CRANberries или CRANtastic?

Обновление 1 (не делайте этого — см. мой ответ ниже): я забыл упомянуть, что CRAN перечисляет «В представлениях:» для пакетов. Таким образом, кажется, что за кулисами хранится некоторая информация, сопоставляющая пакеты с представлениями, в которых они находятся. Можно легко (и грубо) очистить все страницы пакетов CRAN и найти «В представлениях:». Это была моя первоначальная идея, пока я не наткнулся на ctv, который немного более элегантен.

Обновление 2: я пропустил ссылку на ctv. Документация по пакету интересна, если вам нравятся представления задач.


person Iterator    schedule 01.09.2011    source источник


Ответы (2)


Никаких скрытых трюков, просто воссоздайте что-то вроде CRANberries (что начинается с вызова available.packages() и сравнения с данными состояния, которые он хранит в локальной базе данных).

В вашем случае вы можете захотеть вычислить установленные различия между тем, что available.packages() дает вам, и тем, что вы получаете из пакета ctv в отношении выбора представления задач.

Изменить 1 Ваша идея "Обновить 1" несовершенна. Слишком грубо. Метаинформация в CRAN поступает, как мне кажется, из правильного учета метаинформации: первый набор — это все пакеты, дополнительные наборы для каждого представления задач, возможно, разделенные на «перечисленные» и «рекомендуемые» и объединенные.

Редактировать 2 Я думаю, вы просто используете код из ctv для анализа его файлов, полученных наборов. Мы использовали это в cran2deb для определения меньших наборов тестов для создания пакетов. Имея этот набор (и другие данные), они могут генерировать веб-страницы. Я думаю, что вы, возможно, слишком усложняете вещи. R делает это возможным, как я тоже чертовски хорошо знаю ;-)

person Dirk Eddelbuettel    schedule 01.09.2011
comment
+1 А ты бы знал. :-) Вы знаете, как настраивается просмотр In? Я полагаю, что за кулисами в штаб-квартире CRAN есть немного волшебства, если только я смогу разблокировать волшебный SQL-запрос. - person Iterator; 01.09.2011
comment
Вы быстрее написали свое редактирование, чем я отправил свой комментарий. :) - person Iterator; 01.09.2011

Я должен был более внимательно прочитать документацию ctv. Ответ был тут же: есть файл .rds с именем Views.rds. Вот пошаговый метод:

myRepos         <- "http://cran.r-project.org"
tmpfile         <- tempfile()
download.file(paste(myRepos, "src/contrib/Views.rds", sep = "/"), destfile = tmpfile)

myViews         <- .readRDS(tmpfile)
func_listPkgs   <- function(x){return(x$packagelist$name)}
aggRaw          <- lapply(myViews, func_listPkgs)
aggInViews      <- unique(unlist(aggRaw))

availRaw        <- available.packages(contriburl = paste(myRepos, "src/contrib", sep = "/"))
availPkgs       <- rownames(availRaw)
notInViews      <- setdiff(availPkgs, aggInViews)

Вот что это делает:

  1. Он получает файл Views.rds с зеркала CRAN.
  2. Он загружает Views.rds во фрейм данных. Примечание. До версии 2.13 нужно было использовать .readRDS, который теперь равен readRDS с версией 2.13. .readRDS все еще работает, хотя и устарело.
  3. Он получает список доступных пакетов. Это можно было бы сделать более прямым: есть файл с именем Packages.gz, который можно загрузить, но затем мы должны его разобрать. Давайте придерживаться уже имеющихся инструментов. :)
  4. Он запускает diff в двух списках. Ради интереса попробуйте противоположный diff: oddPackages <- setdiff(aggInViews, availPkgs). Некоторые из них являются пакетами в базе R. Другие ??? кто знает.
person Iterator    schedule 01.09.2011
comment
Вы получите от меня твердое "ага" за это :) - person Dirk Eddelbuettel; 01.09.2011
comment
В качестве бонуса: кто-то может взять этот набор и создать мультиклассовый классификатор, предлагающий потенциальные представления задач для разных пакетов на основе зависимостей, предложений, авторов и соответствия ключевых слов (для толпы НЛП :)). - person Iterator; 01.09.2011