我对“清单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
任何人都可以给我一个建议吗?
答案 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()
直接获取图库示例文件。