UseMethod("t")đang nói với bạn rằng đó t()là một hàm chung ( S3 ) có các phương thức cho các lớp đối tượng khác nhau.
Hệ thống điều phối phương thức S3
Đối với các lớp S3, bạn có thể sử dụng methodshàm để liệt kê các phương thức cho một hàm hoặc lớp chung cụ thể.
> 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
"Các chức năng không nhìn thấy được dấu hoa thị" có nghĩa là chức năng này không được xuất từ không gian tên của gói. Bạn vẫn có thể xem mã nguồn của nó thông qua :::chức năng (tức là stats:::t.ts) hoặc bằng cách sử dụng getAnywhere(). getAnywhere()là hữu ích vì bạn không cần phải biết gói chức năng này đến từ đâu.
> 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>
Hệ thống điều phối phương thức S4
Hệ thống S4 là một hệ thống điều phối phương thức mới hơn và là một hệ thống thay thế cho hệ thống S3. Dưới đây là một ví dụ về chức năng 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.
Đầu ra đã cung cấp rất nhiều thông tin. standardGenericlà một chỉ báo của chức năng S4. Phương pháp để xem các phương thức S4 được xác định được cung cấp một cách hữu ích:
> showMethods(chol2inv)
Function: chol2inv (package base)
x="ANY"
x="CHMfactor"
x="denseMatrix"
x="diagonalMatrix"
x="dtrMatrix"
x="sparseMatrix"
getMethod có thể được sử dụng để xem mã nguồn của một trong các phương thức:
> getMethod("chol2inv", "diagonalMatrix")
Method Definition:
function (x, ...)
{
chk.s(...)
tcrossprod(solve(x))
}
<bytecode: 0x000000000ea2cc70>
<environment: namespace:Matrix>
Signatures:
x
target "diagonalMatrix"
defined "diagonalMatrix"
Ngoài ra còn có các phương thức có chữ ký phức tạp hơn cho mỗi phương thức, ví dụ
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"
Để xem mã nguồn của một trong các phương thức này, toàn bộ chữ ký phải được cung cấp, vd
getMethod("extract" , signature = c( x = "Raster" , y = "SpatialPolygons") )
Nó sẽ không đủ để cung cấp chữ ký một phần
getMethod("extract",signature="SpatialPolygons")
#Error in getMethod("extract", signature = "SpatialPolygons") :
# No method found for function "extract" and signature SpatialPolygons
Các hàm gọi các hàm không được báo cáo
Trong trường hợp ts.union, .cbindtsvà .makeNamesTslà chức năng unexported từ statsnamespace. Bạn có thể xem mã nguồn của các hàm không được báo cáo bằng cách sử dụng :::toán tử hoặc 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>
Các hàm gọi mã được biên dịch
Lưu ý rằng "đã biên dịch" không đề cập đến mã R được biên dịch byte như được tạo bởi gói trình biên dịch . Các <bytecode: 0x294e410>dòng trong kết quả trên chỉ ra rằng chức năng là byte-biên soạn, và bạn vẫn có thể xem mã nguồn từ dòng lệnh R.
Chức năng gọi .C, .Call, .Fortran, .External, .Internal, hoặc .Primitiveđang kêu gọi điểm vào trong mã biên dịch, vì vậy bạn sẽ phải nhìn vào nguồn mã biên dịch nếu bạn muốn hiểu đầy đủ các chức năng. Gương GitHub này của mã nguồn R là một nơi tốt để bắt đầu. Chức năng này pryr::show_c_sourcecó thể là một công cụ hữu ích vì nó sẽ đưa bạn trực tiếp đến trang GitHub để thực hiện .Internalvà .Primitivegọi. Gói có thể sử dụng .C, .Call, .Fortran, và .External; nhưng không .Internalhoặc .Primitive, bởi vì chúng được sử dụng để gọi các hàm được tích hợp trong trình thông dịch R.
Các lệnh gọi đến một số hàm trên có thể sử dụng một đối tượng thay vì chuỗi ký tự để tham chiếu hàm đã biên dịch. Trong những trường hợp, đối tượng là các lớp "NativeSymbolInfo", "RegisteredNativeSymbol"hoặc "NativeSymbol"; và in đối tượng mang lại thông tin hữu ích. Ví dụ: optimcác cuộc gọi .External2(C_optimhess, res$par, fn1, gr1, con)(lưu ý đó C_optimhess, không phải "C_optimhess"). optimnằm trong gói thống kê, vì vậy bạn có thể nhập stats:::C_optimhessđể xem thông tin về hàm được biên dịch.
Mã tổng hợp trong một gói
Nếu bạn muốn xem mã được biên dịch trong một gói, bạn sẽ cần tải xuống / giải nén nguồn gói. Các tệp nhị phân được cài đặt là không đủ. Mã nguồn của gói có sẵn từ cùng kho lưu trữ CRAN (hoặc tương thích CRAN) mà gói ban đầu được cài đặt từ đó. Các download.packages()chức năng có thể có được nguồn gói cho bạn.
download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")
Điều này sẽ tải xuống phiên bản nguồn của gói Matrix và lưu .tar.gztệp tương ứng trong thư mục hiện tại. Mã nguồn cho các hàm được biên dịch có thể được tìm thấy trong srcthư mục của tệp không nén và chưa được nén. Bước không nén và giải nén có thể được thực hiện bên ngoài Rhoặc từ bên trong Rbằng cách sử dụng untar()chức năng. Có thể kết hợp bước tải xuống và mở rộng thành một cuộc gọi (lưu ý rằng chỉ có thể tải xuống một gói tại một thời điểm theo cách này):
untar(download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")[,2])
Ngoài ra, nếu việc phát triển gói được lưu trữ công khai (ví dụ qua GitHub , R-Forge hoặc RForge.net ), bạn có thể có thể duyệt mã nguồn trực tuyến.
Mã được biên dịch trong gói cơ sở
Một số gói được coi là gói "cơ sở". Những gói xuất xưởng với R và phiên bản của họ bị khóa lên phiên bản của R. Ví dụ như base, compiler, stats, và utils. Như vậy, chúng không có sẵn dưới dạng các gói có thể tải xuống riêng biệt trên CRAN như được mô tả ở trên. Thay vào đó, chúng là một phần của cây nguồn R trong các thư mục gói riêng lẻ bên dưới /src/library/. Cách truy cập nguồn R được mô tả trong phần tiếp theo.
Mã biên dịch được tích hợp trong trình thông dịch R
Nếu bạn muốn xem mã được tích hợp sẵn cho trình thông dịch R, bạn sẽ cần tải xuống / giải nén các nguồn R; hoặc bạn có thể xem các nguồn trực tuyến thông qua kho lưu trữ R Subversion hoặc gương github của Winston Chang .
Bài báo tin tức R của Uwe Ligges (PDF) (trang 43) là một tài liệu tham khảo chung tốt về cách xem mã nguồn cho .Internalvà các .Primitivechức năng. Các bước cơ bản trước tiên là tìm tên hàm trong src/main/names.cvà sau đó tìm kiếm tên "C-entry" trong các tệp trong src/main/*.