Как увидеть исходный код функции R .Internal или .Primitive?
Ни один из них не показывает исходный код функции pnorm
,
stats:::pnorm getAnywhere(pnorm)
Как я могу увидеть исходный код pnorm
?
sum (..., na.rm = FALSE) .Primitive("sum") .Primitive("sum") function (..., na.rm = FALSE) .Primitive("sum") methods(sum) no methods were found
и как я могу увидеть исходный код функции sum
?
- Формат чисел до значительных цифр в R
- индекс возврата из вектора значения, ближайшего к данному элементу
- Манекены переменных из строковой переменной
- Как опустить значения NA при одновременном вставке нескольких значений столбцов?
- Сценарий Sourcing R поверх HTTPS
- как найти верхние значения N по группам или внутри категории (по группам) в R.frame
- Поиск локальных максимумов и минимумов
- Удаление пустых строк файла данных в R
- Как проверить, вызывает ли вызов функции предупреждение?
- Увеличение на 1 для каждого изменения в столбце
- Что делает функция «pol» на самом деле?
- Как удалить все объекты, кроме одного из рабочей области в R?
- Получение OVER QUERY LIMIT после одного запроса с геокодом
Исходный код R pnorm
:
function (q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE) .Call(C_pnorm, q, mean, sd, lower.tail, log.p)
Итак, технически говоря, ввод «pnorm» действительно показывает вам исходный код. Однако более полезно: кишки pnorm
закодированы на C, поэтому совет в исходном исходном коде предыдущего вопроса в R полезен только для периферии (большая часть его сосредоточена на функциях, скрытых в пространствах имен и т. Д.).
Статья Уве Лиггеса в новостях R (стр. 43) является хорошей общей ссылкой. Из этого документа:
Когда вы смотрите на исходный код R, иногда вызывает одну из следующих функций: .C (), .Call (), .Fortran (), .External () или .Internal () и .Primitive (). Эти функции вызывают точки входа в скомпилированный код, такие как общие объекты, статические библиотеки или библиотеки динамических ссылок. Поэтому необходимо изучить источники скомпилированного кода, если требуется полное понимание кода. … Первым шагом является поиск точки входа в файл ‘$ R HOME / src / main / names.c’, если вызывающая функция R является либо .Primitive (), либо .Internal (). Это делается в следующем примере для кода, реализующего «простую» функцию функции R ().
(Акцент добавлен, потому что точная функция, о которой вы спросили ( sum
), рассматривается в статье Лигге.)
В зависимости от того, насколько серьезно вы хотите вникнуть в код, может быть стоит загрузить и распаковать исходный код, как предлагает Ligges (например, вы можете использовать инструменты командной строки, такие как grep
для поиска по исходному коду). Для более случайного осмотра вы можете просматривать источники в Интернете через сервер R Subversion или зеркало github Winston Chang (ссылки здесь специально для src/nmath/pnorm.c
). (Угадав нужное место для поиска, src/nmath/pnorm.c
, немного src/nmath/pnorm.c
в структуре исходного кода R).
mean
и sum
реализованы в summary.c .
Я знаю, что этот пост больше двух лет, но я думал, что это может быть полезно для некоторых пользователей, просматривающих этот вопрос.
Я просто копирую свой ответ на этот другой подобный вопрос, чтобы он мог оказаться полезным для некоторых пользователей R, которые хотят изучить исходные файлы C.
-
Во-первых, с помощью pryr вы можете использовать функцию
show_c_source
которая будет искать в GitHub соответствующую часть кода в исходных файлах C. Работает для .Internal и .Primitive функций.body(match.call) # .Internal(match.call(definition, call, expand.dots)) pryr::show_c_source(.Internal(match.call(definition, call, expand.dots)))
Это приведет вас к этой странице , показывая, что
unique.c
содержит функцию do_matchcall . -
Я собрал этот файл с разделителями табуляции , основываясь на файле
names.c
и используя find-in-files для определения местоположения исходного кода. Существуют некоторые функции, имеющие файлы, специфичные для платформы, и несколько других, для которых имеется более одного файла с соответствующим исходным кодом. Но для остальных отображение довольно хорошо установлено, по крайней мере, для текущей версии (3.1.2).
> methods(mean) [1] mean.data.frame mean.Date mean.default mean.difftime mean.IDate* [6] mean.POSIXct mean.POSIXlt mean.yearmon* mean.yearqtr* Non-visible functions are asterisked > mean.default function (x, trim = 0, na.rm = FALSE, ...) { if (!is.numeric(x) && !is.complex(x) && !is.logical(x)) { warning("argument is not numeric or logical: returning NA") return(NA_real_) } if (na.rm) x <- x[!is.na(x)] if (!is.numeric(trim) || length(trim) != 1L) stop("'trim' must be numeric of length one") n <- length(x) if (trim > 0 && n) { if (is.complex(x)) stop("trimmed means are not defined for complex data") if (any(is.na(x))) return(NA_real_) if (trim >= 0.5) return(stats::median(x, na.rm = FALSE)) lo <- floor(n * trim) + 1 hi <- n + 1 - lo x <- sort.int(x, partial = unique(c(lo, hi)))[lo:hi] } .Internal(mean(x)) }