Какой тип объекта представляет собой пакет R?

Вероятно, довольно простой вопрос, но мы с другом попытались запустить str(packge_name), и R выдал нам ошибку. Теперь, когда я смотрю на это, мне интересно, похож ли пакет R на файл .zip в том смысле, что он представляет собой набор объектов, скажем, изображений и песен, но не саму картинку или песню.

Если бы я попытался открыть zip-архив с изображениями в программе просмотра изображений, он не знал бы, что делать, пока я не распаковал бы его — так же, как я не могу вызвать str(forecast), но я могу вызвать str(ts) после того, как загрузил пакет прогноза в свой библиотека...

Кто-нибудь может поставить меня прямо?


person d8aninja    schedule 13.01.2015    source источник
comment
Возможно, вас больше впечатлит ls.str("package:packageName")   -  person Rich Scriven    schedule 13.01.2015
comment
Пакет — это просто набор функций R (с документацией), склеенных вместе и организованных файлами DESCRIPTION и NAMESPACE. Пакет сам по себе не является объектом R.   -  person Roland    schedule 13.01.2015
comment
Ну, иногда более чем строго функции. Иногда также существуют наборы данных и другие нефункциональные объекты, необходимые для запуска пакета.   -  person Rich Scriven    schedule 13.01.2015
comment
@ Роланд, так что, если это не объект .... что это?   -  person d8aninja    schedule 13.01.2015
comment
@RichardScriven Конечно, но давайте сначала рассмотрим самый простой случай.   -  person Roland    schedule 13.01.2015
comment
@RichardScriven нет - > library(fpp) > ls.str(fpp) Error in ls.str(fpp) : object 'fpp' not found   -  person d8aninja    schedule 13.01.2015
comment
@Canuckish - вы должны ввести его, как и я, ls.str("package:fpp") Функция ls.str должна знать, что вы хотите просмотреть содержимое пакета   -  person Rich Scriven    schedule 13.01.2015
comment
@Canuckish Я не уверен, что для пакетов действительно существует тип объекта, но, судя по комментарию @RichardScriven, я бы предположил, что он больше всего похож на environment, по крайней мере, в том смысле, что вы можете называйте такие вещи, как ls(name="package:ggplot2") или ls.str(name="package:ggplot2").   -  person nrussell    schedule 13.01.2015
comment
Вы можете найти r-pkgs.had.co.nz/package.html. полезный   -  person hadley    schedule 13.01.2015
comment
Круто - спасибо @hadley! (Кто-то также сослался на этот отличный ресурс ниже)   -  person d8aninja    schedule 13.01.2015


Ответы (4)


Пакеты R обычно распространяются в виде сжатых пакетов файлов. Они могут быть либо в «бинарной» форме, которые предварительно обрабатываются в репозитории для компиляции любого исходного кода C или Fortran и создания соответствующих заголовков, либо они могут быть в исходной форме, где доступны различные необходимые файлы для использования в процессе установки, но для этого требуется, чтобы у пользователей были установлены необходимые компиляторы и инструменты в местах, где процесс сборки R с использованием системных ресурсов ОС может их достать.

Если вы читаете документацию к пакету в CRAN, вы видите, что они распространяются в наборе сжатых форматов, которые различаются в зависимости от целей ОС:

Package source:     Rcpp_0.11.3.tar.gz  # the Linus/UNIX targets
Windows binaries:   r-devel: Rcpp_0.11.3.zip, r-release: Rcpp_0.11.3.zip, r-oldrel: Rcpp_0.11.3.zip
OS X Snow Leopard binaries:     r-release: Rcpp_0.11.3.tgz, r-oldrel: Rcpp_0.11.3.tgz
OS X Mavericks binaries:    r-release: Rcpp_0.11.3.tgz
Old sources:    Rcpp archive   # not really a file but a web link

После установки пакет R будет иметь указанную структуру каталогов. Файл DESCRIPTION — это текстовый файл с конкретными записями для компонентов, которые определяют, соответствует ли локальная установка зависимостям пакета. Есть файлы NAMESPACE, LICENSE и INDEX. Существуют каталоги с именами '/help', '/html', '/Meta', '/R' и, возможно, '/libs', '/demo', '/data', '/unitTests' и другие.

Это дерево в верхней части каталога пакетов ../library/Rcpp:

$ ls
CITATION    NAMESPACE   THANKS      examples    libs
DESCRIPTION NEWS.Rd     announce    help        prompt
INDEX       R       discovery   html        skeleton
Meta        README      doc     include     unitTests

Таким образом, в «жизненном цикле» пакета изначально будет ряд обязательных и необязательных файлов, которые затем обрабатываются механизмами BUILD и CHECK в установленный пакет, который затем сжимается для распространения, а затем распаковывается. в указанное дерево каталогов на компьютере пользователя. См. эти страницы справки:

?.libPaths  # also describes .Library()
?package.skeleton
?install.packages
?INSTALL

И, конечно же, прочтите «Написание расширений R» — документ, который поставляется с каждой установкой R.

person IRTFM    schedule 13.01.2015

Ваш вопрос:

Какой тип объекта представляет собой пакет R?

Почему-то мне до сих пор не хватает ответа на этот точный вопрос. Итак, вот:

Что касается R, пакет R не является объектом. То есть это не объект в системе типов R. R немного сложен, потому что он позволяет вам писать

library(pkg_name)

Не требуя от вас определения pkg_name где-либо ранее. Напротив, другие объекты, которые вы используете в R, должны где-то определяться — либо вами, либо каким-либо пакетом, который загружается явно или неявно.

Это печально и смущает людей. Поэтому, когда вы видите library(pkg_name), думайте

library('pkg_name')

То есть представьте имя пакета в кавычках. Это на самом деле работает так, как ожидалось. Тот факт, что код также работает без кавычек, является особенностью функции library, известной как нестандартная оценка . В данном случае это скорее неудачное дизайнерское решение (но на то есть причины).

Итак, повторим ответ: пакет не является типом объекта R1. Для R это просто имя, которое ссылается на известное место в файловой системе, как вы и предполагали. Ответ BondedDust подробно описывает эту структуру, поэтому я не буду повторяться здесь.


1 Технические подробности см. в комментариях Джошуа и Ричарда ниже.

person Konrad Rudolph    schedule 13.01.2015
comment
Тск, тск... s/имя_библиотеки/имя_пакета. :) Единственное, что я мог бы добавить, это то, что pkg_name это объект (несвязанный символ в парном списке, содержащем аргументы функции)... хотя это может быть слишком технически. - person Joshua Ulrich; 13.01.2015
comment
Я думаю, что это чертовски хороший ответ, и я застрял между проверкой его или @BondedDust выше. Поскольку он был первым, что я проверил, я собираюсь вернуть его туда. Но мне очень нравится этот ответ. Большое спасибо. - person d8aninja; 13.01.2015
comment
Просто примечание: структура TypeTable находится в src/main/util. .c показывает все базовые типы. Пакет не входит в их число. Подумал, может кому пригодится. :) - person Rich Scriven; 13.01.2015
comment
Согласитесь, ответ полезен. Он написан с точки зрения человека, наблюдающего за миром с консоли R и интерпретирующего возникающие ошибки. Мой был написан с точки зрения человека, использующего R в одной из трех целевых ОС. - person IRTFM; 13.01.2015
comment
@ Джошуа Честно говоря, я недоволен этим аспектом моего ответа, в частности, потому что library - не единственное подходящее место, где вы можете столкнуться с этим (подумайте pkg::obj). Я все еще размышляю над тем, обновлять ли свой ответ, или это будет скорее запутанным, чем полезным. - person Konrad Rudolph; 13.01.2015
comment
Да, и pkg::obj еще хуже, потому что менее очевидно, что :: является вызовом функции. - person Joshua Ulrich; 13.01.2015

Из собственной документации R:

Пакеты предоставляют механизм для загрузки дополнительного кода, данных и документации по мере необходимости… Пакет — это каталог файлов, которые расширяют R, исходный пакет (основные файлы пакета) или архив, содержащий файлы исходного пакета, или установленный пакет, результат выполнения команды R CMD INSTALL для исходного пакета. На некоторых платформах (особенно OS X и Windows) существуют также бинарные пакеты, zip-файл или tar-архив, содержащие файлы установленного пакета, которые можно распаковать, а не устанавливать из исходников. Пакет не является библиотекой.

Так что да, пакет — это не функции внутри него; это механизм, позволяющий R использовать функции или данные, составляющие пакет. Таким образом, он должен быть загружен в первую очередь.

person Avraham    schedule 13.01.2015
comment
Очень полезный. Но, как заметил @Roland, это не объект - так это просто каталог? - person d8aninja; 13.01.2015
comment
@Canuckish, нет, каталог, в котором находится пакет, называется library. Что сбивает с толку, так как пакеты загружаются с использованием вызова функции library(foo). Я исправил гиперссылку в приведенном выше ответе, чтобы она указывала на нужную страницу руководства. - person Avraham; 13.01.2015
comment
На самом деле пытался получить тип пакета - мне интересно, что, хотя все в R является вектором, я должен использовать специальный вызов (структура списка?), например `ls.str(package:package_name) как рекомендуется над. - person d8aninja; 13.01.2015

Я читаю книгу Хэдли Advanced-R (глава 6.3 - функции, стр. 79). ) и эта цитата вас покроет, я думаю:

Every operation is a function call
“To understand computations in R, two slogans are helpful:

Everything that exists is an object.
Everything that happens is a function call."
— John Chambers

В соответствии с этим использование library(name_of_library) — это вызов функции, которая загрузит пакет. Каждый бит, который был загружен, то есть функции или наборы данных, objects, которые вы можете использовать, вызывая другие функции. В этом смысле пакет не является object ни в одной из сред R, пока он не загружен. Тогда вы можете сказать, что это набор objects, которые он содержит и которые загружены.

person LyzandeR    schedule 13.01.2015
comment
Несколько похоже на то, что я ищу, но почему str(package_name) выдает ошибку, если str должен компактно отображать внутреннюю структуру объекта R - person d8aninja; 13.01.2015
comment
Потому что все дело в environments. Вам нужно взглянуть на приведенную выше ссылку в главе environments. Если вы загружаете пакет, его environment добавляется перед глобальным окружением в наборе environments. environments — это практически то место, где R ищет каждый объект. Если вы не загрузите package, R не сможет найти, где находится это имя, и, следовательно, вы получите сообщение об ошибке. - person LyzandeR; 13.01.2015
comment
Я не думаю, что эта цитата действительно помогает ОП. На самом деле это вводит в заблуждение, потому что «все, что существует, является объектом», но, несмотря на кажущееся обратное, package_name в str(package_name) не существует с точки зрения R (и не является объект), если OP не определил его ранее. - person Konrad Rudolph; 13.01.2015
comment
@KonradRudolph Но я упоминал выше, что пакет представляет собой набор объектов, а не сам объект. - person LyzandeR; 13.01.2015
comment
В конечном счете, ОП интересовался тем, к какому типу относится пакет. Коллекция объектов - прекрасный ответ, но не отвечает на вопрос. Тем не менее, ваш ответ был показательным, и я ценю ваш вклад. - person d8aninja; 13.01.2015