2017-06-21 6 views
2

私はRcpp 0.12.11とR 3.4.0を使用しています。私は、0.12.11にRcppによって自動的に生成されたRファイルRcppExports.RをRcppをアップグレード:: compileAttributesがわずかに異なる機能が自動生成されたRcppExports.Rのチェックエラーにつながる関数

run_graph_match <- function(A, B, algorithm_params) { 
# Rcpp 0.12.10 
.Call('RGraphM_run_graph_match', PACKAGE = 'RGraphM', A, B, algorithm_params) 

# Rcpp 0.12.11 
.Call(RGraphM_run_graph_match, A, B, algorithm_params) 
} 

を呼び出して私を与えるために始めた

を説明する簡単な方法はあります変化の理由?

後者の機能は、Rパッケージをチェックするときにエラーにつながります。たとえば、エラーなど シンボル 'RGraphM_run_graph_match' の名前空間ではない: は.call(RGraphM_run_graph_match、A、B、algorithm_params)

+1

可能性:属性の詳細については、私の歴史の記事を参照してくださいこれは[この質問と回答](https://stackoverflow.com/q/42313373/5977215)に関連しており、github – SymbolixAU

答えて

3

おめでとう、あなたはR 3.4.0で追加さSection 5.4: Registering native routines要件を経験しました。この要求では、それぞれC++関数とそのパラメータを登録したsrc/init.cファイルを含める必要がありました。したがって、Rcpp 0.12.11はRcppExports.cppの内部でこのファイルを生成します。一方、この質問に基づいているRcppExports.Rファイルは、ユーザがuseDynLib(pkgname, .registration=TRUE)またはuseDynLib(pkgname)を適切に設定するかどうかによってコンテキストが異なりますが、Rcpp 0.12で導入された新しいオプションを利用していないため、 .11次に議論する。

CRANポリシーにおけるこのシフトの結果として、JJアライア、Rcpp ための属性の作成者は、バック属性が最初に加え2012年ダグラスベイツ製の提案を進めるために促されました。具体的には、呼び出しを文字列ベースからシンボルに変更することでした。変更の背後にある論理的根拠は、パッケージがロードされたときにシンボルがオンになり、関数が実行されるたびにルックアップされてシンボルに変換されなければならない文字列になります。したがって、過去のRcppの文字列ベースのメソッドと比較した場合、シンボルルックアップは反復呼び出しで安価です。

基本的には、この行:

.Call('RGraphM_run_graph_match', PACKAGE = 'RGraphM', A, B, algorithm_params) 

参加するRはC++機能にアクセスするための包括的なR関数の呼び出しごとにシンボルを調べます。

一方、この行:シンボルがメモリに既にあるよう

.Call(RGraphM_run_graph_match, A, B, algorithm_params) 

C++関数への直接の呼び出しです。

これは、主にの背後にある理由です。 Rcppが変更された理由は、RcppExports.Rが自動的に生成された理由です。このアプローチの欠点の1つは、以前のようにすべての関数をグローバルにエクスポートできないことです。特に、NAMESPACEファイル内にグローバルシンボルエクスポート文を持っていた一部のユーザ。

exportPattern("^[[:alpha:]]+") 

を削除して、エクスポートする関数または変数を手動で指定する必要がありました。

https://github.com/RcppCore/Rcpp/pull/694


1:

詳細については、この機能を導入GitHubのPRを参照したい場合がありhttp://thecoatlessprofessor.com/programming/rcpp/to-rcpp-attributes-and-beyond-from-inline/

+0

のリンクディスカッションAFAIK noファイル 'src/init.c'は必須です。登録されたものだけがそこに置かれます(または 'src/RcppExports.cpp'にあるように)。 –

関連する問題