R是開放原始碼軟體, 以下說明查詢函數的原始碼的方法(參考 1, 2).
C程式在編譯成R時,可直接經由 primitives(原生) 或 .Internal interface (.內部介面)來呼叫使用, 此方式與 .External interface (.外部介面)類似, 但使用語法不相同.
「.Internal」 和 「.Primitive」 一般用於呼叫 C 的介面:
使用 pryr 套件的 ftype 函數可檢視該函數的種類:
# 2
直接輸入函數名稱, 即可顯示原始檔.
#4
getAnywhere {utils} 可查詢函數隸屬於哪些套件與內容. 使用 show_c_source {pryr}可檢視該函數原始檔.
#5
使用 methods 函數與 getAnywhere 函數.
[2] https://stackoverflow.com/questions/3485228/view-source-code-in-r
[3] R Core Team, R Internals - Version 3.4.1 (2017-06-30), URL: https://cran.r-project.org/doc/manuals/r-release/R-ints.pdf.
[4] R 原始碼, https://cran.r-project.org/src/base/R-3/R-3.4.1.tar.gz
簡介
R函數許多原始檔案包括 C, Fortran等程式碼, 常用呼叫其他已編譯完成程式的函數包括: .C .Call, .Fortran, .External, .Internal, .Primitive 等函數. (參考3 R Internals, 2017).C程式在編譯成R時,可直接經由 primitives(原生) 或 .Internal interface (.內部介面)來呼叫使用, 此方式與 .External interface (.外部介面)類似, 但使用語法不相同.
「.Internal」 和 「.Primitive」 一般用於呼叫 C 的介面:
- .Internal 是標準的用法,在呼叫C之前可以檢查R程式碼中的參數 .
- .Primitive 執行效能較高,但不允許在函數中使用R程式.
查詢函數原始碼
# 1使用 pryr 套件的 ftype 函數可檢視該函數的種類:
- regular/primitive/internal function
- internal/S3/S4 generic
- S3/S4/RC method
library(pryr)
ftype(apply) # "function"
# 2
直接輸入函數名稱, 即可顯示原始檔.
apply
# 3
在 RStuido 軟體的程式編輯視窗, 選取 apply , 按 CTRL + 滑鼠左鍵, 可開啟原始檔.
#4
getAnywhere {utils} 可查詢函數隸屬於哪些套件與內容. 使用 show_c_source {pryr}可檢視該函數原始檔.
#5
使用 methods 函數與 getAnywhere 函數.
R程式碼
library(pryr)
ftype(apply) # "function"
apply
lapply
ftype(lapply) # "internal"
getAnywhere(lapply)
show_c_source(.Primitive(lapply(x)))
princomp
ftype(princomp) # "s3" "generic"
methods(princomp)
getAnywhere(princomp.default)
# end
參考資料
[1] https://stackoverflow.com/questions/19226816/how-can-i-view-the-source-code-for-a-function[2] https://stackoverflow.com/questions/3485228/view-source-code-in-r
[3] R Core Team, R Internals - Version 3.4.1 (2017-06-30), URL: https://cran.r-project.org/doc/manuals/r-release/R-ints.pdf.
[4] R 原始碼, https://cran.r-project.org/src/base/R-3/R-3.4.1.tar.gz