2017年7月26日 星期三

函數原始碼 source code

R是開放原始碼軟體, 以下說明查詢函數的原始碼的方法(參考 1, 2).

簡介

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程式.
R的原始碼 R-3.4.1.tar.gz (參考4) 解壓縮之後在 \R-3.4.1.tar\R-3.4.1\src\main 目錄中存放約121個 *.c 原始碼.



查詢函數原始碼

# 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

    沒有留言:

    張貼留言