Foreign
位於 base
包(package)。 說明
調用已加載的編譯代碼的函數R.
用法
.C(.NAME, ..., NAOK = FALSE, DUP = TRUE, PACKAGE, ENCODING)
.Fortran(.NAME, ..., NAOK = FALSE, DUP = TRUE, PACKAGE, ENCODING)
參數
.NAME |
給出 C 函數或 Fortran 子例程名稱的字符串,或引用此類名稱的 |
... |
要傳遞給外部函數的參數。最多 65 個。 |
NAOK |
如果 |
PACKAGE |
如果提供,則限製對字符串的搜索 這是為了增加包的安全性,通過使用這個參數可以確保沒有其他包可以覆蓋它們的外部符號,並且還可以加快搜索速度(請參閱“注意”)。 |
DUP, ENCODING |
為了向後兼容,接受但忽略。 |
細節
這些函數可用於調用已編譯的 C 和 Fortran 代碼。後來的接口是.Call
和.External
,更加靈活並且性能更好。
這些函數是 primitive ,並且 .NAME
始終與提供的第一個參數(不應命名)匹配。其他命名參數遵循...
,因此不能縮寫。為了清楚起見,應避免在傳遞給 ...
的參數中使用與 .NAME
匹配或部分匹配的名稱。
值
與傳入參數的 ...
列表類似的列表(包括為參數指定的任何名稱),但反映了 C 或 Fortran 代碼所做的任何更改。
參數類型
類型的映射RC 或 Fortran 參數的參數是
R | C | Fortran |
integer | int * | integer |
numeric | 雙倍的 * | 雙精度 |
- 或者 - | float * | real |
complex | R複合體 * | 雙複合體 |
logical | int * | integer |
character | 字符 ** | [見下文] |
raw | 無符號字符 * | 不允許 |
list | 性經驗* | 不允許 |
other | SEXP | 不允許 |
注意:integer
和 logical
對應的 C 類型是 int
,而不是 S 中的 long
。這種差異在大多數 64 位平台上很重要,其中 int
是 32 位,long
是64 位(但不適用於 64 位 Windows)。
注意:logical
對應的 Fortran 類型是 integer
,而不是 logical
:這種差異對某些 Fortran 編譯器很重要。
中的數值向量R將作為類型傳遞double *
到 C(並且作為double precision
Fortran)除非參數有屬性Csingle
調成TRUE
(使用as.single
或者single
)。該機製僅用於促進現有 C 和 Fortran 代碼的接口。
C型Rcomplex
定義於‘Complex.h' 作為一個typedef struct {double r; double i;}
。它可能等同於也可能不等同於 C99double complex
類型,具體取決於所使用的編譯器。
邏輯值以 0
( FALSE
)、1
( TRUE
) 或 INT_MIN = -2147483648
( NA
,但僅當 NAOK = TRUE
) 的形式發送,並且編譯後的代碼應返回這三個值之一:但是 INT_MIN
以外的非零值被映射到 TRUE
。
缺失的 ( NA
) 字符串值將作為字符串 "NA" 傳遞給 .C
。由於 C char
類型可以表示所有可能的位模式,因此似乎無法區分丟失的字符串和字符串 "NA"
。如果這種區別很重要,請使用 .Call
。
不推薦使用帶有 .Fortran
的字符串,並且會發出警告。它將字符向量的第一個(唯一)字符串作為 C 字符數組傳遞給 Fortran:如果單獨傳遞其真實長度,則可以將其用作 character*255
。最多僅傳回字符串的 255 個字符。 (它的工作效果如何,甚至是否有效,都取決於 C 和 Fortran 編譯器以及平台。)
列表、函數或其他R對象可以(由於曆史原因)傳遞給.C
,但是.Call
接口是更優選的。除了原子向量之外的所有輸入都應被視為隻讀,並且除了向量(包括列表)之外的所有輸入、函數和環境現在均已棄用。
Fortran 符號名稱
所有已知可用於編譯的 Fortran 編譯器R將符號名稱映射為小寫,也是如此.Fortran
.
包含下劃線的符號名稱在 Fortran 77 中無效(盡管它們在 Fortran 9x 中有效)。許多 Fortran 77 編譯器將允許它們,但可能會以不同的方式將它們轉換為不包含下劃線的名稱。此類名稱通常會與.Fortran
(因為它們的翻譯方式是在R被構建並使用的信息.Fortran
),但可移植代碼不應使用包含下劃線的 Fortran 名稱。
采用.Fortran
小心編譯的 Fortran 9x 代碼:如果使用的 Fortran 9x 編譯器與配置時使用的 Fortran 編譯器不同,則可能無法工作R,特別是當子例程名稱不是小寫或包含下劃線時。調用 Fortran 9x 代碼的最便攜方式R是使用.C
和 Fortran 2003 模塊iso_c_binding
為 Fortran 代碼提供 C 接口。
複製參數
在調用編譯代碼並收集結果之前複製字符向量。對於其他原子向量,如果在調用代碼中以其他方式使用參數,則在調用編譯代碼之前複製參數。
非原子向量對象對於 C 代碼來說是隻讀的,並且永遠不會被複製。
可以通過設置 options(CBoundsCheck = TRUE)
來更改此行為。在這種情況下,原始、邏輯、整數、雙精度和複數向量參數在調用編譯代碼之前和之後都會被複製。製作的第一個副本在每一端都通過保護字節進行擴展,並且在返回時檢查這些字節是否未被更改。對於 .C
,字符向量的每個元素都使用保護字節。
注意
如果要頻繁使用這些函數之一,請指定 PACKAGE
(將搜索限製為單個 DLL)或將 .NAME
作為本機符號對象之一傳遞。搜索符號可能需要很長時間,尤其是在加載許多命名空間時。
你可能會看到PACKAGE = "base"
對於鏈接到的符號R。不要在您自己的代碼中使用此符號:此類符號不是 API 的一部分,可能會在沒有警告的情況下進行更改。
參考
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
也可以看看
“編寫 R 擴展”手冊。
相關用法
- R file.path 構造文件路徑
- R grep 模式匹配和替換
- R getwd 獲取或設置工作目錄
- R vector 向量 - 創建、強製等
- R lapply 對列表或向量應用函數
- R dump R 對象的文本表示
- R Sys.getenv 獲取環境變量
- R rank 樣本排名
- R getDLLRegisteredRoutines DLL 中 C/Fortran 例程的反射信息
- R pushBack 將文本推回連接
- R strsplit 分割字符向量的元素
- R seq.Date 生成規則的日期序列
- R invisible 將打印模式更改為不可見
- R noquote “無引號”字符串打印類
- R warning 警告信息
- R rapply 遞歸地將函數應用於列表
- R basename 操作文件路徑
- R with 評估數據環境中的表達式
- R formals 訪問和操縱形式參數
- R icuSetCollate 按 ICU 設置整理
- R search 給出 R 對象的搜索路徑
- R Defunct 將對象標記為已失效
- R gzcon 通過連接(解)壓縮 I/O
- R readRenviron 從文件設置環境變量
- R Sys.localeconv 查找當前語言環境中數字和貨幣表示形式的詳細信息
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Foreign Function Interface。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。