
118
#' @useDynLib mypackage add_
add <- function(x, y) .Call(add_, x, y)
.Call()
の最初の引数
add_
は、どこから来たのでしょうか。それは
@useDynLib
に由来します。
NAMESPACE
に、以下のような設定が
1
行あるはずです。
useDynLib(mypackage, add_)
このディレクティブは、
C
の関数への参照となる
add_
というオブジェクトを作るように
R
に指
示しています。
mypackage:::add_
#> $name
#> [1] "add_"
#>
#> $address
#> <pointer: 0x107be3f40>
#> $package
#> NULL
#>
#> attr(,"class")
#> [1] "NativeSymbolInfo"
.Call()
は、
C
の関数へのポインタを取得し、それを呼び出します。すべての
R
のオブジェクト
は同じ
C
の型(
SEXP
)を持っているため、引数は期待される型に合わせておかなければいけませ
ん。
R
の関数や
C
の関数でその処理を行うか、あるいは、不適切な入力が誤って渡されたときに、
毎回
R
がクラッシュしてしまうことを単に受け入れましょう。
.Call()
インターフェースを使うときに、最も複雑な部分はメモリ管理です。
R
で扱うレベルの
データ構造を使う場合、ガベージコレクタによってその分のメモリが解放されてしまわないように
するため
PROTECT()