Cc中的.nrow()方法在Rcpp中返回零

时间:2018-03-22 07:07:10

标签: r rcpp

使用 Rcpp ,我在 C ++ 中定义了矩阵 M 。使用M.nrow(),我们应该能够检索行数。但是,当我尝试将行数作为IntegerVector返回时,答案是错误的:

set.seed(1100)
M = matrix(sample(18), nrow = 6)
Rcpp::cppFunction('IntegerVector tccp5(IntegerMatrix M) { int x = M.nrow(); return x;}')
tccp5(M)
# [1] 0 0 0 0 0 0

正确的答案应该是行数,例如

# [1] 6

你能解释一下发生了什么吗?

2 个答案:

答案 0 :(得分:2)

虽然@ gfgm的答案很明显,但我想扩展为什么宣布为int而不是IntegerVector导致正确的构造。

特别是, R 中的每个返回都会使用wrap()无缝转换为SEXP S 表达结构的表达式。通过提供IntegerVector并返回intwrap()必须实例化IntegerVector长度为x,因为SEXP不存在int {1}}。另一方面,当定义的返回类型为int时, Rcpp wrap()功能可以正确地将int强制转换为IntegerVector }。

强调基础&#34;无缝&#34;发生转换时,我们将参数verbose = TRUE添加到cppFunction(),以查看 C ++ 代码的编写方式:编译,链接并导入 R < / em>的。 (注意:我已将输出截断为汇编。)

如果我们考虑:

Rcpp::cppFunction('IntegerVector tccp5(IntegerMatrix M) { int x = M.nrow(); return x;}',
                  verbose = TRUE)

我们得到:

Generated code for function definition: 
--------------------------------------------------------

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
IntegerVector tccp5(IntegerMatrix M) { int x = M.nrow(); return x;}

Generated extern "C" functions 
--------------------------------------------------------


#include <Rcpp.h>
// tccp5
IntegerVector tccp5(IntegerMatrix M);
RcppExport SEXP sourceCpp_7_tccp5(SEXP MSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< IntegerMatrix >::type M(MSEXP);
    rcpp_result_gen = Rcpp::wrap(tccp5(M));
    return rcpp_result_gen;
END_RCPP
}

与:相比:

Rcpp::cppFunction('int tccp5(IntegerMatrix M) { int x = M.nrow(); return x;}', 
                  verbose = TRUE)

给出:

Generated code for function definition: 
--------------------------------------------------------

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
int tccp5(IntegerMatrix M) { int x = M.nrow(); return x;}

Generated extern "C" functions 
--------------------------------------------------------


#include <Rcpp.h>
// tccp5
int tccp5(IntegerMatrix M);
RcppExport SEXP sourceCpp_9_tccp5(SEXP MSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< IntegerMatrix >::type M(MSEXP);
    rcpp_result_gen = Rcpp::wrap(tccp5(M));
    return rcpp_result_gen;
END_RCPP
}

答案 1 :(得分:1)

由于函数的类型声明而产生异常输出。

library(Rcpp)
M <- matrix(sample(1:18), nrow=6)

cppFunction('int tccp6(IntegerMatrix M) { int x = M.nrow(); return x;}')
tccp6(M)
#> [1] 6

reprex package(v0.2.0)创建于2018-03-22。