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 Уинстона Чанга .
Новостная статья Уве Лиггеса R (PDF) (стр. 43) является хорошим общим справочным материалом о том, как просматривать исходный код .Internalи .Primitiveфункции. Основные шаги - сначала поиск имени функции в, src/main/names.cа затем поиск имени «C-entry» в файлах в src/main/*.