На моем ПК с Windows установлена версия R 4.3.2. Я скачал его с https://cran.r-project.org/bin/windows/base/. Я не загрузил файл .tar.gz с исходным кодом R.
Я знаю, как просмотреть код функции. Например, если я наберу chisq.test
в консоли, я получу код для функции chisq.test
. Это базовая функция из пакета stats
.
Дело в том, что код, отображаемый в консоли, должен где-то храниться, в каком-то файле на моем компьютере. Код не мог бы отображаться, если бы это было не так.
Где это? Это общий метод поиска таких мест?
Я действительно пытался найти его, но безрезультатно. Его нет в C:/Program Files/R/R-4.3.2. Я загрузил его в репозиторий GitHub, поискал chisq.test
и тоже не получил результатов. Я также просмотрел другие папки на том же жестком диске и ничего не нашел. В stackoverflow я тоже не нашел ничего полезного.
Я ожидаю, что код будет где-то храниться.
Вы можете выполнить функцию .libPaths()
, чтобы получить пути к файлам, в которых установлены ваши пакеты. Одна из этих папок предназначена для пакетов, установленных пользователем, а другая — для базовых пакетов, например {stats}
. Этот ответ основан на этом ответе StackOverflow.
Другой вариант — функция R.home()
, которая вернет путь к вашей установке R. В этой папке каталог library
содержит базовые пакеты, такие как {stats}
.
Пакет {lookup} также позволяет просматривать определения функций, включая скомпилированный код, методы S3 и S4:
# install.packages("devtools")
# devtools::install_github("jimhester/lookup")
library(lookup)
lookup(chisq.test)
lookup::lookup_usage("chisq.test")
Вы также можете просмотреть исходный код R в зеркале GitHub
Пожалуйста, прочитайте мой обновленный ответ
Пакет выглядит интересно и является очень хорошим вариантом для быстрого поиска исходного кода функций R на основе скомпилированных функций C. Это автоматический способ поиска кода в репозитории исходного кода. Но я уже знал, как найти его в репозитории (вручную, медленно и с большим терпением). Однако я до сих пор не знаю, как найти более простой код R локально на моем компьютере. Более того, я попытался установить пакет, но получаю ошибку: Error: Failed to install 'lookup' from GitHub: Failed to install 'highlite' from GitHub: ! System command 'Rcmd.exe' failed
Вы не найдете код R в папке пакета. Код R скомпилирован.
@StéphaneLaurent Если он скомпилирован, как можно увидеть код chisq.test
в консоли?
@FranciscoJácomeMaura Я не знаю. Но если вы мне не верите, воспользуйтесь поисковиком текста, чтобы отсканировать папку, и вы увидите, что кода R нет.
R хранит дерево разбора (а иногда и исходный код). Для базовых функций это почти всегда просто дерево разбора. То, что вы видите, является результатом вызова «deparse()» в этом дереве синтаксического анализа. (Вы не видите никаких комментариев, не так ли?) Если бы исходный код был сохранен, он был бы сохранен в сжатом виде, поэтому даже его трудно найти с помощью внешних инструментов.
Интересно, можно ли найти код скомпилированной функции в исходном коде R
@user2554330 user2554330 Это выглядит убедительно. Однако я не знаком с деревьями разбора. Как отмечает @BenBolker в своем ответе, код находится в сжатом двоичном файле (stats.rdb
), и его трудно получить. Но при доступе код не содержит комментариев. Какое отношение дерево разбора имеет к файлу .rdb
?
Дерево разбора представляет собой представление кода. Например, код 1 + 2 # comment
будет представлен в виде парного списка, содержащего (+, 1, 2)
(комментарий полностью опущен). f(x) + g(y)
будет сложнее, например: (+, (f, x), (g, y))
. Файл .rdb
содержит двоичную версию одного парного списка для каждого объекта в среде пакета, объединенную вместе. Файл .rdx
сообщает R, где найти каждый из них. (Это слишком упрощенно. Многие объекты имеют атрибуты, некоторые объекты ссылаются на другие объекты и т. д.)
Как упоминал @StephaneLaurent в комментариях, стандартная установка R не включает исходный код в удобочитаемом текстовом формате; вместо этого он находится в двоичном формате, который R более удобен для распаковки.
В окне консоли/терминала R RHOME
предоставит вам домашний каталог R (при условии, что R находится на вашем пути, чтобы его можно было найти...). Начиная с этого каталога, переход на library\stats\R
покажет вам, где на самом деле находится код. К сожалению, код пакета хранится в виде двух двоичных файлов: stats.rdb
и stats.rdx
. Этот вопрос спрашивает, как открыть .rdb
файлы (нетривиально). Эти файлы более подробно описаны в разделе «Отложенная загрузка» руководства по внутреннему устройству R . ( В этой статье Брайана Рипли объясняется, что такое «ленивая загрузка», почему она полезна и как R использует механизм rdb
/rdx
.)
Практичнее было бы либо скачать и распаковать исходный код R из CRAN (и перейти к src/library/stats/R/chisq.test.R
), либо посмотреть соответствующий файл на зеркале r-svn Github (или на официальном сервере R Subversion).).
Это хороший ответ. Итак, если я правильно понял, код chisq.test
и других функций в stats
хранится в stats.rdx
и stats.rdb
(в основном в последнем). Это двоичные файлы, которые также сжаты, поэтому их нельзя прочитать напрямую. В R есть метод распаковки и выражения этой информации в виде обычного текста, и именно так код отображается в консоли, когда я набираю chisq.test
. Я прав?
Да все верно.
Я принял ответ, но у меня появилось новое сомнение. Имеют ли файлы .rdb
какое-либо отношение к функциям, компилируемым побайтово? Я читал этот вопрос, и мне было интересно, были ли функции stats
скомпилированы побайтово в файл stats.rdb
, имеет ли это какой-либо смысл.
Это отдельная тема. Основная причина хранения данных в этом формате заключается в том, что R может иметь доступ к указателям на отдельные объекты (функции и данные) в пакете, но не требует загрузки объектов до тех пор, пока пользователь действительно не попытается что-то с ними сделать. Это экономит накладные расходы на загрузку всех функций в (потенциально очень большом) пакете, поскольку пользователь хочет использовать только одну из них. (См. статью, на которую я сейчас дал ссылку в своем ответе.)
Я читал этот пост ранее. Если я напишу
.libPaths()
в консоли, я получу путь «C:/Program Files/R/R-4.3.2/library». Однако кодаchisq.test
там нет...