3

次の関数をSHLIB(として保存foo.cpp)でコンパイルしようとしています:

#include <Rcpp.h>

RcppExport SEXP foo( SEXP x, SEXP y){
        Rcpp::NumericVector xx(x), yy(y) ;
        int n = xx.size() ;
        Rcpp::NumericVector res( n ) ;
        double x_ = 0.0, y_ = 0.0 ;
        for( int i=0; i<n; i++){
                x_ = xx[i] ;
                y_ = yy[i] ;
                if( x_ < y_ ){
                        res[i] = x_ * x_ ;
                } else {
                        res[i] = -( y_ * y_) ;
                }
        }
        return res ;
}

私は試します

$ R CMD SHLIB foo.cpp 
/opt/local/bin/g++-mp-4.4 -I/opt/local/lib/R/include -I/opt/local/lib/R/include/x86_64  -I/opt/local/include    -fPIC  -pipe -O2 -m64 -c foo.cpp -o foo.o
foo.cpp:1:18: error: Rcpp.h: No such file or directory
foo.cpp:3: error: 'RcppExport' does not name a type
make: *** [foo.o] Error 1

このファイルをインクルードするにはどうすればよいですか? これは Rcpp でスタンドアロン関数をコンパイルする正しい方法ですか? もちろん、Rcpp を でインストールしましinstall.packages('Rcpp')た。

更新: RI get で Rcpp.h の場所を見つけようとしています:

> system.file("lib", "Rcpp.h", package="Rcpp")
[1] ""
> 

でも、

> Rcpp:::LdFlags()
/opt/local/lib/R/library/Rcpp/lib/x86_64/libRcpp.a> 

更新 2:

http://www.mail-archive.com/r-help@r-project.org/msg79185.htmlを見て、試してみました

$ PKG_CPPFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'` \
>          PKG_LIBS=`Rscript -e 'Rcpp:::LdFlags()'` \
>          R CMD SHLIB foo.cpp
/opt/local/bin/g++-mp-4.4 -I/opt/local/lib/R/include -I/opt/local/lib/R/include/x86_64 -I/opt/local/lib/R/library/Rcpp/include -I/opt/local/include    -fPIC  -pipe -O2 -m64 -c foo.cpp -o foo.o
/opt/local/bin/g++-mp-4.4 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/opt/local/lib -o foo.so foo.o /opt/local/lib/R/library/Rcpp/lib/x86_64/libRcpp.a -L/opt/local/lib/R/lib/x86_64 -lR

と を生成foo.ofoo.soました。これをRにインポートするにはどうすればよいですか?

更新 3:dyn.loadしたがって、次のよう にロードできます。

> dyn.load("foo.so")
> is.loaded("foo")
[1] TRUE

次のように正常に呼び出すことができます

> .Call("foo",x=as.numeric(c(1,2,3)),y=as.numeric(c(4,5,6)))
[1] 1 4 9

関数自体は表示されませんが。

> foo
Error: object 'foo' not found
4

2 に答える 2

3

あなたの質問は、質問 2.4 で明確に扱われています。Rcpp- FAQの

于 2011-12-07T21:20:36.940 に答える
2

私が見つけた答えSHLIBは、Rcpp ファイルの場所を提供する必要があるということです。これは次のように行うことができます

$ PKG_CPPFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'` \
>          PKG_LIBS=`Rscript -e 'Rcpp:::LdFlags()'` \
>          R CMD SHLIB foo.cpp

次に、コンパイルされたファイルをRに次のようにロードできます

> dyn.load("foo.so")

Rでは次のように呼び出すことができます

> .Call("foo",c(1,2,3),c(4,5,6))
于 2011-12-07T19:05:13.077 に答える