% R CMD SHLIB gaqd.f
13 他の言語とのインターフェース
13.1 CとFortran
SPHREPACKは球面調和函数ライブラリで、NCAR Classic Library for Geophysicsから取得できます。
gaqd.f
を使ってガウス緯度を求めてみましょう。 CやFortranを呼び出すには、まずソースから共有ライブラリを作ります。 次のコマンドを実行すると、gaqd.so
ができます。
Base RにはCやFortranを呼び出すためのFFI (Foreign Function Interfance)として、.C()
と.Fortran()
があります。 これらは引数をあらかじめ用意する必要がある上、変数はコピーされるので効率が良くありません。 ここでは、パッケージdotCall64を用います。 dotCall64は、64ビットの整数を扱えるので、2GB以上の配列を扱えます。
コンパイルされた函数を呼び出す.C64()
は、CもFortranも扱えます。 引数の型をdouble
, integer
, int64
からSIGNATURE
に指定します。 INTENT
には、read(読み込み)、read and write(読み書き)、write(書き込み)を意味するr
、rw
、w
が指定できます。 - r
は変数を用意する必要がありますが、コンパイルされた函数にポインタ(メモリの場所)が渡されるだけで、コピーはされません。 - rw
はRオブジェクトのコピーが生成され、コンパイルされた函数はポインタを受け取ります。 - w
に対応する変数は、vector_dc()
、numeric_dc()、
integer_dc()`で割り付けることができます。 これらの仕組みにより、Rオブジェクトの生成を制御できます。
library(dotCall64)
dyn.load("gaqd.so")
<- function(nlat) {
gaqd <- 0
w <- 0L
lwork 1<- .C64("gaqd",
gaus 2c("integer", "double", "double", "double", "integer", "integer"),
3theta = numeric_dc(nlat), wts = numeric_dc(nlat),
nlat, ierror= integer_dc(1),
w, lwork, 4INTENT=c("rw", "w", "w", "r", "r", "w"))
c(1, 2, 3, 6)]
gaus[ }
- 1
- サブルーチンの名前を渡します。
- 2
-
SIGNATURE
として引数の型を指定します。 - 3
-
ガウス余緯度
theta
と重みwts
はnumeric_dc()
で長さnlat
の倍精度浮動小数点数ベクトルを作っています。エラーコードierror
は長さ1の整数ベクトルを作っています。 - 4
-
返り値に
nlat
を含めるため、nlat
はrw
で指定しています。theta
とwts
、w
とlwork
は、ダミー変数なのでr
とします。
13.2 Rcpp
Rcppを使うと、RからC/C++のコードを使えます。 RcppParallel: は並列プログラミング、 RcppEigenや RcppArmadilloは線型代数演算を扱うC++ライブラリEigenとArmadilloの機能を提供します。
13.3 Python
reticulateを使うと、PythonをRから呼び出すことができます。
例えば、Numpyのnpyファイルx.npy
を読むには次のようにします。
library(reticulate)
<- import("numpy")
np <- np$load("x.npy") x