ダークの答えを拡張するには; dim
R行列は、実際には属性セットを持つ単なるベクトルです
> x <- 1
> y <- as.matrix(x)
> .Internal( inspect(x) )
@7f81a6c80568 14 REALSXP g0c1 [MARK,NAM(2)] (len=1, tl=0) 1 ## data
> .Internal( inspect(y) )
@7f81a3ea86c8 14 REALSXP g0c1 [NAM(2),ATT] (len=1, tl=0) 1 ## data
ATTRIB:
@7f81a3e68e08 02 LISTSXP g0c0 []
TAG: @7f81a30013f8 01 SYMSXP g1c0 [MARK,LCK,gp=0x4000] "dim" (has value)
@7f81a3ea8668 13 INTSXP g0c1 [NAM(2)] (len=2, tl=0) 1,1
x
との「データ」コンポーネントy
が単なるs であることに注意してください。ただし、行列にREALSXP
はこの余分なコンポーネントがあります。これを使用すると、 aを の行列にdim
簡単に変換できます。NumericVector
Rcpp
(注: 以下の例では、SEXP
型間の変換が明示的になるように、属性で使用しています):
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
SEXP vec_to_mat(SEXP x_) {
std::vector<double> x = as< std::vector<double> >(x_);
/* ... do something with x ... */
NumericVector output = wrap(x);
output.attr("dim") = Dimension(x.size(), 1);
return output;
}
/*** R
m <- c(1, 2, 3)
vec_to_mat(m)
*/
私にくれます
> m <- c(1, 2, 3)
> vec_to_mat(m)
[,1]
[1,] 1
[2,] 2
[3,] 3
したがって、Dimension
クラスを使用しdim
てベクトルの属性に割り当てて、Rcpp で行列を「手動で」作成できます。