RcppGSL内联

时间:2013-12-26 15:31:56

标签: r rcpp

我对“清单11.20-11.21”(无缝R和C ++与Rcpp集成的第11章)有困难。使用的代码是:

inctxt = '
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_blas.h>
'

bodytxt = '
RcppGSL::matrix<double> M = sM;
int k = M.ncol();
Rcpp::NumericVector n(k);

for (int j = 0; j < k ; j++){
RcppGSL::vector_view<double> colview = gsl_matrix_column (M,j);
n[j] = gsl_blas_dnrm2(colview);
} 
M.free();
return n;
'

foo <- cxxfunction(signature(sM="numeric"),body=bodytxt,inc=inctxt,plugin="RcppGSL")
M <- outer(sin(0:9),rep(1,10),"*") + outer(rep(1,10),cos(0:9),"*")
foo(M)

该功能有效,但是当我尝试使用package.skeleton时会出现警告信息,我认为此消息不正常,但我不知道该怎么办?

package.skeleton("mypackage",foo)
>> standard package.skeleton from utils
Creating directories ...
Creating DESCRIPTION ...
Erro em if (!namespace) warning("From R 2.14.0 on, every package gets a NAMESPACE.",  : 
  argumento tem comprimento zero

任何人都可以给我一个建议吗?

2 个答案:

答案 0 :(得分:1)

我肯定建议您切换到属性并使用Rcpp::depends(RcppGSL)。像这样:

#include <RcppGSL.h>
// [[Rcpp::depends(RcppGSL)]]

#include <gsl/gsl_matrix.h>
#include <gsl/gsl_blas.h>

using namespace Rcpp ;

// [[Rcpp::export]]
NumericVector foo(RcppGSL::matrix<double> M ){
  int k = M.ncol();
  NumericVector n(k);

  for (int j = 0; j < k ; j++){
    RcppGSL::vector_view<double> colview = gsl_matrix_column (M,j);
    n[j] = gsl_blas_dnrm2(colview);
  } 
  M.free();
  return n;
}

然后您可以直接sourceCpp

答案 1 :(得分:1)

警告是无害的,来自参数namespace=FALSE,当NAMESPACE在R中仍然是可选的时,inline包的旧版本用于部署。正如NEWS向您展示的那样在两个inline版本之前发生了变化。

同样,Rcpp包将其包装器更改为package.skeleton()以不再使用此选项。我们在0.10.6发布之前做出了这一改变。而且Kevin Ushey亲切地添加了另一个与提供用户功能相关的补丁,这个补丁仍然被打破0.10.6。因此,您应该能够在不提供函数的情况下运行Rcpp.package.skeleton("newpackage"),除非您在存储库中运行未发布的Rcpp版本。

但是现在你也可以使用Rcpp属性。有关GSL的完整用法示例,请参阅Rcpp图库中的这些帖子:

您可以使用sourceCpp()直接获取图库示例文件。