Как найти файл, содержащий код функции R?

На моем ПК с 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 я тоже не нашел ничего полезного.

Я ожидаю, что код будет где-то храниться.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете выполнить функцию .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

Я читал этот пост ранее. Если я напишу .libPaths() в консоли, я получу путь «C:/Program Files/R/R-4.3.2/library». Однако кода chisq.test там нет...

Francisco Jácome Maura 24.07.2024 01:05

Пожалуйста, прочитайте мой обновленный ответ

Bastián Olea Herrera 24.07.2024 01:11

Пакет выглядит интересно и является очень хорошим вариантом для быстрого поиска исходного кода функций R на основе скомпилированных функций C. Это автоматический способ поиска кода в репозитории исходного кода. Но я уже знал, как найти его в репозитории (вручную, медленно и с большим терпением). Однако я до сих пор не знаю, как найти более простой код R локально на моем компьютере. Более того, я попытался установить пакет, но получаю ошибку: Error: Failed to install 'lookup' from GitHub: Failed to install 'highlite' from GitHub: ! System command 'Rcmd.exe' failed

Francisco Jácome Maura 24.07.2024 01:45

Вы не найдете код R в папке пакета. Код R скомпилирован.

Stéphane Laurent 24.07.2024 02:41

@StéphaneLaurent Если он скомпилирован, как можно увидеть код chisq.test в консоли?

Francisco Jácome Maura 24.07.2024 02:59

@FranciscoJácomeMaura Я не знаю. Но если вы мне не верите, воспользуйтесь поисковиком текста, чтобы отсканировать папку, и вы увидите, что кода R нет.

Stéphane Laurent 24.07.2024 03:10

R хранит дерево разбора (а иногда и исходный код). Для базовых функций это почти всегда просто дерево разбора. То, что вы видите, является результатом вызова «deparse()» в этом дереве синтаксического анализа. (Вы не видите никаких комментариев, не так ли?) Если бы исходный код был сохранен, он был бы сохранен в сжатом виде, поэтому даже его трудно найти с помощью внешних инструментов.

user2554330 24.07.2024 11:42

Интересно, можно ли найти код скомпилированной функции в исходном коде R

Bastián Olea Herrera 24.07.2024 14:56

@user2554330 user2554330 Это выглядит убедительно. Однако я не знаком с деревьями разбора. Как отмечает @BenBolker в своем ответе, код находится в сжатом двоичном файле (stats.rdb), и его трудно получить. Но при доступе код не содержит комментариев. Какое отношение дерево разбора имеет к файлу .rdb?

Francisco Jácome Maura 24.07.2024 16:48

Дерево разбора представляет собой представление кода. Например, код 1 + 2 # comment будет представлен в виде парного списка, содержащего (+, 1, 2) (комментарий полностью опущен). f(x) + g(y) будет сложнее, например: (+, (f, x), (g, y)). Файл .rdb содержит двоичную версию одного парного списка для каждого объекта в среде пакета, объединенную вместе. Файл .rdx сообщает R, где найти каждый из них. (Это слишком упрощенно. Многие объекты имеют атрибуты, некоторые объекты ссылаются на другие объекты и т. д.)

user2554330 24.07.2024 17:44
Ответ принят как подходящий

Как упоминал @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. Я прав?

Francisco Jácome Maura 24.07.2024 16:39

Да все верно.

Ben Bolker 24.07.2024 17:21

Я принял ответ, но у меня появилось новое сомнение. Имеют ли файлы .rdb какое-либо отношение к функциям, компилируемым побайтово? Я читал этот вопрос, и мне было интересно, были ли функции stats скомпилированы побайтово в файл stats.rdb, имеет ли это какой-либо смысл.

Francisco Jácome Maura 24.07.2024 21:42

Это отдельная тема. Основная причина хранения данных в этом формате заключается в том, что R может иметь доступ к указателям на отдельные объекты (функции и данные) в пакете, но не требует загрузки объектов до тех пор, пока пользователь действительно не попытается что-то с ними сделать. Это экономит накладные расходы на загрузку всех функций в (потенциально очень большом) пакете, поскольку пользователь хочет использовать только одну из них. (См. статью, на которую я сейчас дал ссылку в своем ответе.)

Ben Bolker 24.07.2024 21:48

Другие вопросы по теме