Как увидеть исходный код функции 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 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.

  1. Во-первых, с помощью 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 .

  2. Я собрал этот файл с разделителями табуляции , основываясь на файле 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)) }   
  • Извлечь месяц и год из зоопарка :: объект yearmon
  • Как вы кодируете функцию R так, чтобы она «знала», чтобы искать «данные» для переменных в других аргументах?
  • вставлять кавычки в строку символов, в цикле
  • Какая польза от этого?
  • обнаружена ошибка segfault в R
  • Альтернатива expand.grid для data.frames
  • Определить все объекты данного classа для дальнейшей обработки
  • Создание вектора, разделенного запятыми
  • Процент% в%
  • Перечислить списки в R
  • Как я могу прерывать текущий код в R с помощью команды клавиатуры?
  • Давайте будем гением компьютера.