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
มีฟังก์ชั่น unexported จากstats
namespace คุณสามารถดูรหัสที่มาของฟังก์ชั่น unexported โดยใช้ผู้ประกอบการหรือ:::
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 และรุ่นของพวกเขาจะถูกขังอยู่กับรุ่นของอาร์ตัวอย่าง ได้แก่base
, compiler
, และstats
utils
ดังนั้นจึงไม่มีอยู่ในแพ็คเกจดาวน์โหลดแยกต่างหากบน CRAN ดังที่อธิบายไว้ข้างต้น แต่พวกเขาเป็นส่วนหนึ่งของต้นไม้ R /src/library/
แหล่งที่มาในแพคเกจไดเรกทอรีของแต่ละบุคคลภายใต้ วิธีการเข้าถึงแหล่ง R ได้อธิบายไว้ในส่วนถัดไป
โค้ดที่คอมไพล์แล้วที่สร้างไว้ในตัวแปล R
หากคุณต้องการดูรหัสในตัวล่าม R คุณจะต้องดาวน์โหลด / แกะแหล่ง R; หรือคุณสามารถดูแหล่งที่มาออนไลน์ผ่านการวิจัยเก็บข้อมูลการโค่นล้มหรือกระจก GitHub วินสตันช้าง
บทความข่าวของ Uwe Ligges (PDF) (หน้า 43) เป็นข้อมูลอ้างอิงทั่วไปที่ดีเกี่ยวกับวิธีการดูซอร์สโค้ด.Internal
และ.Primitive
ฟังก์ชัน ขั้นตอนพื้นฐานจะดูครั้งแรกสำหรับชื่อฟังก์ชันในsrc/main/names.c
แล้วค้นหา "C-รายการ" src/main/*
ชื่อในแฟ้มใน