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/*.