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