我正在尝试用Rcpp加速我的一个R程序,这将要求我使用几个GSL例程。但是,我在Mac OSX Yosemite(版本10.10.5)上安装RcppGSL时遇到了麻烦,希望你们中的一个可以提供帮助。我已经找到了几个关于在Windows上安装它的问题,但没有关于Mac的问题。我是一位经验丰富的R用户,但对C ++和Rcpp来说却是一个新手。我不想把它变成一个包 - 只是在我的机器上以交互方式使用它。
下面,我有一个最小的例子(我正在调用这个文件min_ex.cpp
)GSL标题比最小例子中实际使用的更多 - 这些是我在实际代码中需要的。< / p>
#include <RcppGSL.h>
// [[Rcpp::depends(RcppGSL)]]
#include <cmath>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_blas.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_interp.h>
#include <gsl/gsl_multiroots.h>
#include <gsl/gsl_statistics_double.h>
#include <gsl/gsl_spline.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector testFn(int nObs)
{
Rprintf("Test print");
RcppGSL::vector<double> Lambda01(nObs);
return 0;
}
当我尝试使用sourceCpp()时会发生这种情况:
> library(Rcpp)
> library(RcppGSL)
> sourceCpp('~/Documents/PATH REDACTED/Rcpp/min_ex.cpp')
Error in dyn.load("/private/var/folders/xn/ggql1jjj1t5cbct50ff7yc_h0000gn/T/RtmpTJy2yB/sourceCpp-x86_64-apple-darwin13.4.0-0.12.15/sourcecpp_35001bd26245/sourceCpp_22.so") :
unable to load shared object '/private/var/folders/xn/ggql1jjj1t5cbct50ff7yc_h0000gn/T/RtmpTJy2yB/sourceCpp-x86_64-apple-darwin13.4.0-0.12.15/sourcecpp_35001bd26245/sourceCpp_22.so':
dlopen(/private/var/folders/xn/ggql1jjj1t5cbct50ff7yc_h0000gn/T/RtmpTJy2yB/sourceCpp-x86_64-apple-darwin13.4.0-0.12.15/sourcecpp_35001bd26245/sourceCpp_22.so, 6): Symbol not found: _gsl_vector_calloc
Referenced from: /private/var/folders/xn/ggql1jjj1t5cbct50ff7yc_h0000gn/T/RtmpTJy2yB/sourceCpp-x86_64-apple-darwin13.4.0-0.12.15/sourcecpp_35001bd26245/sourceCpp_22.so
Expected in: flat namespace
in /private/var/folders/xn/ggql1jjj1t5cbct50ff7yc_h0000gn/T/RtmpTJy2yB/sourceCpp-x86_64-apple-darwin13.4.0-0.12.15/sourcecpp_35001bd26245/sourceCpp_22.so
似乎这个问题可能与/Users/MYUSERNAME/.R/Makevars
(我之前从未合作过)有关。这些是文件的当前内容:
CC=clang
CXX=clang++
我还尝试添加以下两个文本块但得到了同样的错误:
PKG_CPPFLAGS = $(GSL_CFLAGS)
PKG_LIBS = $(GSL_LIBS)
和
PKG_LIBS = -lgsl -lgslcblas -lm -lgfortran
我的GSL标题位于/usr/local/include/gsl
,但“获取信息”显示为/usr/local/Cellar/gsl/2.4/include/gsl
。
从阅读开始,似乎有些用户在RcppGSL示例中使用了configure.ac
文件 - 即使我没有创建包,这是否适用?为了以防万一,我将configure.ac
和Makevars.in
复制到包含Rcpp
的同一min_ex.cpp
目录中,并创建了Rcpp/scr
目录。我使用Homebrew安装了autoconf,并从autoconf configure.ac
在终端中运行~/Documents/PATH REDACTED/Rcpp
。我有更多的输出而不是有意义粘贴在这里,但它没有立即清楚是否有效,除了没有生成Makevars文件。我怎样才能在我的机器上正确运行它? (我想更普遍的是,我不太了解Makevars--我如何指示R使用一些反对/Users/MYUSERNAME/.R/Makevars
的Makevars文件?)
提前谢谢!如果我能提供任何澄清,请告诉我。
已修改为我的R会话添加信息:
> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X Yosemite 10.10.5
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] tools stats graphics grDevices utils datasets methods base
other attached packages:
[1] RcppGSL_0.3.3 Rcpp_0.12.15 SemiCompRisks_2.7 survival_2.41-3
[5] MASS_7.3-45
loaded via a namespace (and not attached):
[1] Matrix_1.2-8 withr_1.0.2 memoise_1.0.0 splines_3.3.2 grid_3.3.2
[6] digest_0.6.12 devtools_1.12.0 lattice_0.20-34
已编辑以添加有关使用示例包的信息:
我将RcppGSL包复制到我的工作目录,并将以下代码添加到colNorm.cpp
:
// [[Rcpp::export]]
Rcpp::NumericVector testFn(int nObs)
{
Rprintf("Test print");
RcppGSL::vector<double> Lambda01(nObs);
return 0;
}
然后在RStudio中运行以下内容,正确更新了RcppExports.R
和RcppExports.cpp
。
compileAttributes(pkgdir="RcppGSLExample/", verbose=T)
在终端,我跑了:
R CMD build RcppGSLExample
R CMD INSTALL RcppGSLExample_0.0.3.tar.gz
但是当我将它加载到RStudio时,我能够使用colNorm复制该示例,但不能复制testFn。
> library(RcppGSLExample)
> M <- outer(sin(0:9), rep(1,10), "*") + outer(rep(1, 10), cos(0:9), "*")
> print(colNorm(M))
[1] 4.314614 3.120504 2.193159 3.261141 2.534157 2.572810 4.204689
[8] 3.652017 2.085236 3.073134
> testFn(2)
Error: could not find function "testFn"
你看到我可能缺少的任何步骤吗?谢谢!