UseMethod("t")
говорить вам, що t()
це ( S3 ) загальна функція, яка має методи для різних класів об'єктів.
Система диспетчеризації методу S3
Для класів S3 ви можете використовувати methods
функцію для переліку методів для певної родової функції або класу.
> methods(t)
[1] t.data.frame t.default t.ts*
Non-visible functions are asterisked
> methods(class="ts")
[1] aggregate.ts as.data.frame.ts cbind.ts* cycle.ts*
[5] diffinv.ts* diff.ts kernapply.ts* lines.ts
[9] monthplot.ts* na.omit.ts* Ops.ts* plot.ts
[13] print.ts time.ts* [<-.ts* [.ts*
[17] t.ts* window<-.ts* window.ts*
Non-visible functions are asterisked
"Невидимі функції призначаються зірочкою" означає, що функція не експортується з простору імен пакету. Ви все ще можете переглядати його вихідний код за допомогою :::
функції (тобто stats:::t.ts
) або за допомогою getAnywhere()
. getAnywhere()
корисно, тому що вам не потрібно знати, з якого пакета прийшла функція.
> getAnywhere(t.ts)
A single object matching ‘t.ts’ was found
It was found in the following places
registered S3 method for t from namespace stats
namespace:stats
with value
function (x)
{
cl <- oldClass(x)
other <- !(cl %in% c("ts", "mts"))
class(x) <- if (any(other))
cl[other]
attr(x, "tsp") <- NULL
t(x)
}
<bytecode: 0x294e410>
<environment: namespace:stats>
Система диспетчеризації методу S4
Система S4 - це новіша система диспетчеризації методів і є альтернативою системі S3. Ось приклад функції S4:
> library(Matrix)
Loading required package: lattice
> chol2inv
standardGeneric for "chol2inv" defined from package "base"
function (x, ...)
standardGeneric("chol2inv")
<bytecode: 0x000000000eafd790>
<environment: 0x000000000eb06f10>
Methods may be defined for arguments: x
Use showMethods("chol2inv") for currently available ones.
Вихідні дані вже пропонують багато інформації. standardGeneric
- показник функції S4. Корисно запропоновано метод побачити визначені методи S4:
> showMethods(chol2inv)
Function: chol2inv (package base)
x="ANY"
x="CHMfactor"
x="denseMatrix"
x="diagonalMatrix"
x="dtrMatrix"
x="sparseMatrix"
getMethod
можна використовувати для перегляду вихідного коду одного з методів:
> getMethod("chol2inv", "diagonalMatrix")
Method Definition:
function (x, ...)
{
chk.s(...)
tcrossprod(solve(x))
}
<bytecode: 0x000000000ea2cc70>
<environment: namespace:Matrix>
Signatures:
x
target "diagonalMatrix"
defined "diagonalMatrix"
Наприклад, існують методи зі складнішими підписами для кожного методу, наприклад
require(raster)
showMethods(extract)
Function: extract (package raster)
x="Raster", y="data.frame"
x="Raster", y="Extent"
x="Raster", y="matrix"
x="Raster", y="SpatialLines"
x="Raster", y="SpatialPoints"
x="Raster", y="SpatialPolygons"
x="Raster", y="vector"
Щоб побачити вихідний код одного з цих методів, повинен бути наданий весь підпис, наприклад
getMethod("extract" , signature = c( x = "Raster" , y = "SpatialPolygons") )
Недостатньо буде надати частковий підпис
getMethod("extract",signature="SpatialPolygons")
#Error in getMethod("extract", signature = "SpatialPolygons") :
# No method found for function "extract" and signature SpatialPolygons
Функції, що викликають не експортовані функції
У разі ts.union
, .cbindts
і .makeNamesTs
є неекспортіруемимі функції з stats
простору імен. Ви можете переглянути вихідний код експортованих функцій за допомогою :::
оператора або getAnywhere
.
> stats:::.makeNamesTs
function (...)
{
l <- as.list(substitute(list(...)))[-1L]
nm <- names(l)
fixup <- if (is.null(nm))
seq_along(l)
else nm == ""
dep <- sapply(l[fixup], function(x) deparse(x)[1L])
if (is.null(nm))
return(dep)
if (any(fixup))
nm[fixup] <- dep
nm
}
<bytecode: 0x38140d0>
<environment: namespace:stats>
Функції, що викликають складений код
Зауважте, що "компільований" не посилається на байтований R-код, створений пакетом компілятора . <bytecode: 0x294e410>
Рядок у висновку вище показує , що функція байт скомпільовані, і ви все ще можете переглянути вихідний код з командного рядка R.
Функції, виклик .C
, .Call
, .Fortran
, .External
, .Internal
, або .Primitive
викликають точки входу в скомпільованому коді, так що ви повинні дивитися на джерелах скомпільованої коду , якщо ви хочете , щоб повністю зрозуміти функцію. Це дзеркало GitHub вихідного коду R - гідне місце для початку. Ця функція pryr::show_c_source
може бути корисним інструментом, оскільки перенесе вас безпосередньо на сторінку GitHub для дзвінків .Internal
та .Primitive
дзвінків. Пакети можуть використовувати .C
, .Call
, .Fortran
і .External
; але не .Internal
або .Primitive
, тому що вони використовуються для виконання функцій , вбудованих в інтерпретатор R.
Виклики до деяких з перерахованих вище функцій можуть використовувати об'єкт замість символьного рядка для посилання на компільовану функцію. У цих випадках об'єкт класу "NativeSymbolInfo"
, "RegisteredNativeSymbol"
або "NativeSymbol"
; а друк об’єкта дає корисну інформацію. Наприклад, optim
дзвінки .External2(C_optimhess, res$par, fn1, gr1, con)
(зауважте, що це C_optimhess
не так "C_optimhess"
). optim
знаходиться в пакеті статистики, тому ви можете ввести, stats:::C_optimhess
щоб побачити інформацію про скомпільовану функцію, що викликається.
Складений код у пакеті
Якщо ви хочете переглянути зібраний код у пакеті, вам потрібно буде завантажити / розпакувати джерело пакета. Встановлених бінарних файлів недостатньо. Вихідний код пакета доступний з того самого сховища CRAN (або сумісного з CRAN), з якого спочатку був встановлений пакет. download.packages()
Функція може отримати вихідний пакет для вас.
download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")
Це завантажить вихідну версію пакету Matrix і збереже відповідний .tar.gz
файл у поточному каталозі. Вихідний код для скомпільованих функцій можна знайти в src
каталозі нестисненого та необробленого файлу. Крок без стискання та розкручування може бути виконаний за межами R
або зсередини R
за допомогою untar()
функції. Можна поєднати крок завантаження та розширення в один виклик (зауважте, що за один раз можна завантажити та розпакувати лише один пакет):
untar(download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")[,2])
Крім того, якщо розробка пакета розміщується публічно (наприклад, через GitHub , R-Forge або RForge.net ), ви, ймовірно, можете переглядати вихідний код в Інтернеті.
Складений код у базовому пакеті
Певні пакети вважаються "базовими" пакетами. Ці пакети поставляються з R і їх версія заблокована в версії R. Приклади включають base
, compiler
, stats
і utils
. Як такі, вони не доступні як окремі завантажувані пакети на CRAN, як описано вище. Швидше, вони є частиною дерева джерел R в каталогах окремих пакетів під /src/library/
. Як отримати доступ до джерела R, описано в наступному розділі.
Складений код, вбудований в інтерпретатор R
Якщо ви хочете переглянути код, вбудований в інтерпретатор R, вам потрібно буде завантажити / розпакувати джерела R; або ви можете переглянути джерела в Інтернеті через сховище R Subversion або дзеркало github Winston Chang .
Стаття новин R ( UW) Ligges (PDF) (стор. 43) - це хороша загальна довідка щодо перегляду вихідного коду .Internal
та .Primitive
функцій. Основні кроки - спершу шукати ім'я функції, src/main/names.c
а потім шукати ім'я "C-entry" у файлах у src/main/*
.