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 methods
hà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. standardGeneric
là 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
, .cbindts
và .makeNamesTs
là chức năng unexported từ stats
namespace. 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_source
có 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 .Internal
và .Primitive
gọi. Gói có thể sử dụng .C
, .Call
, .Fortran
, và .External
; nhưng không .Internal
hoặ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ụ: optim
các cuộc gọi .External2(C_optimhess, res$par, fn1, gr1, con)
(lưu ý đó C_optimhess
, không phải "C_optimhess"
). optim
nằ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.gz
tệ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 src
thư 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 R
hoặc từ bên trong R
bằ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 .Internal
và các .Primitive
chứ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.c
và sau đó tìm kiếm tên "C-entry" trong các tệp trong src/main/*
.