如何在 R 包中使用 RCPP_ARMADILLO_RETURN_ANYVEC_AS_VECTOR?

问题描述 投票:0回答:1

如何在 R 包中使用

RCPP_ARMADILLO_RETURN_ANYVEC_AS_VECTOR

文件

veccany_as_v_test.cpp

// [[Rcpp::depends(RcppArmadillo)]]
#define RCPP_ARMADILLO_RETURN_ANYVEC_AS_VECTOR
#include <RcppArmadillo.h>

using namespace Rcpp;

// [[Rcpp::export]]
arma::vec veccany_as_v_test(const arma::vec& v) { return(v); }

代表:

x <- 1 : 5

Rcpp::sourceCpp("veccany_as_v_test.cpp")

# as expected
veccany_as_v_test(x)
#[1] 1 2 3 4 5

# create basic package
RcppArmadillo::RcppArmadillo.package.skeleton("veccany")
file.copy("veccany_as_v_test.cpp", to = "veccany/src/veccany_as_v_test.cpp")
Rcpp::compileAttributes("veccany")
install.packages("veccany", repos = NULL, type = "source")

# not as expected
veccany::veccany_as_v_test(x)
#     [,1]
#[1,]    1
#[2,]    2
#[3,]    3
#[4,]    4
#[5,]    5

输出

sessionInfo()

R version 4.2.2 (2022-10-31)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Ventura 13.2.1

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.2-arm64/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.2-arm64/Resources/lib/libRlapack.dylib

locale:
[1] C/UTF-8/C/C/C/C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_4.2.2           tools_4.2.2              RcppArmadillo_0.12.0.1.0
[4] Rcpp_1.0.10              veccany_1.0                 
r rcpp rcpparmadillo
1个回答
3
投票

您必须确保在RcppArmadillo的每个#include

之前设置
。确保这一点的一种方法是通过
-D...
中的
src/Makevars
。 (诀窍是我们还需要对
src/RcppExports.cpp
产生影响。通过包含文件有自定义方法——但使用
-D...
更容易。)

简单快速的例子:

创建一个包。

我们可以打电话给

RcppArmadillo.package.skeleton()
。我使用
littler
包裹中的便利包装纸。

修改文件

我在这里编辑

src/rcpparma_hello_world.cpp
,并且为了很好的措施我包括你的
vecany()
功能源代码。

记得在

PKG_CPPFLAGS=-DRCPP_ARMADILLO_RETURN_ANYVEC_AS_VECTOR
中添加
src/Makevars
(和
src/Makevars.win
用于Windows)。

构建和安装

记得调用

compileAttributes()
(添加/更改功能(接口)时),然后安装它。您应该在编译行上看到
-D...

测试一下

$ Rscript -e 'armademo:::veccany_as_v_test(c(2,3,4,42,99))'
[1]  2  3  4 42 99
$ 

我将在一分钟内将其提交到我的 stackoverflow answers repo 中的代码,以便您在那里获得完整的示例。 [完毕。文件在这里。]

© www.soinside.com 2019 - 2024. All rights reserved.