使用 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
你能解释一下发生了什么吗?
答案 0 :(得分:2)
虽然@ gfgm的答案很明显,但我想扩展为什么宣布为int
而不是IntegerVector
导致正确的构造。
特别是, R 中的每个返回都会使用wrap()
无缝转换为SEXP
或 S 表达结构的表达式。通过提供IntegerVector
并返回int
,wrap()
必须实例化IntegerVector
长度为x
,因为SEXP
不存在int
{1}}。另一方面,当定义的返回类型为int
时, Rcpp 的wrap()
功能可以正确地将int
强制转换为IntegerVector
}。
强调基础"无缝"发生转换时,我们将参数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。