我正在为R写一个插件,我想分配一个三维R矩阵来返回。我怎样才能做到这一点?在Rinternals.h
我看到了allocMatrix
和alloc3DArray
。我会使用其中一种吗?
如果它太烦人了,我可以接受用户的矩阵,但我需要知道内部表示是什么,以便我可以填写它。
谢谢。
答案 0 :(得分:0)
似乎存在两个问题。一个是验证来自用户的输入,另一个是分配。如果使用.Call
接口或rcpp策略比仅使用以下分配快得多,我会感到惊讶:
obj <- array(NA, dim=c(x,y,z)) # where the x,y and z values would be user input.
如果您查看array
的代码,您会将其视为可能的主力函数:
if (is.atomic(data) && !is.object(data))
return(.Internal(array(data, dim, dimnames)))
答案 1 :(得分:0)
值得理解的是,R中的数组实际上只是具有维度属性集的向量:
> x <- array(0, c(2, 2, 2))
> .Internal(inspect(x))
@7f859baf5ee8 14 REALSXP g0c4 [NAM(2),ATT] (len=8, tl=0) 0,0,0,0,0,...
ATTRIB:
@7f85a1d593c0 02 LISTSXP g0c0 []
TAG: @7f859c8043f8 01 SYMSXP g1c0 [MARK,LCK,gp=0x4000] "dim" (has value)
@7f85a4040bc0 13 INTSXP g0c2 [NAM(2)] (len=3, tl=0) 2,2,2
因此,如果您想手工制作矩阵或数组,它就像分配正确长度的矢量一样简单,然后设置维度属性。例如:
SEXP myArray = PROTECT(allocVector(REALSXP, m * n * k));
SEXP myDims = PROTECT(allocVector(INTSXP, 3));
setAttrib(myArray, R_DimSymbol, myDims);