我试图创建一个从Rcpp中的big.matrix对象中提取列的函数(以便在将结果带入R之前可以在cpp中分析它) ,但我无法弄清楚如何让它识别NA(它们现在呈现为-2147483648 - 如下面我最小的例子所示)。如果我能从Rcpp直接访问函数GetMatrixCols(src/bigmemory.cpp),那就更好了,但我还没有找到一种方法来实现这一点。从Rcpp中的大内存对象中提取NA的列
#include <Rcpp.h>
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::depends(BH, bigmemory)]]
#include <bigmemory/MatrixAccessor.hpp>
#include <bigmemory/isna.hpp>
using namespace Rcpp;
//Logic for extracting column from a Big Matrix object
template <typename T>
NumericVector GetColumn_logic(XPtr<BigMatrix> pMat, MatrixAccessor<T> mat, int cn) {
NumericVector nv(pMat->nrow());
for(int i = 0; i < pMat->nrow(); i++) {
if(isna(mat[cn][i])) {
nv[i] = NA_INTEGER;
} else {
nv[i] = mat[cn][i];
}
}
return nv;
}
//' Extract Column from a Big Matrix.
//'
//' @param pBigMat A bigmemory object address.
//' @param colNum Column Number to extract. Indexing starts from zero.
//' @export
// [[Rcpp::export]]
NumericVector GetColumn(SEXP pBigMat, int colNum) {
XPtr<BigMatrix> xpMat(pBigMat);
switch(xpMat->matrix_type()) {
case 1: return GetColumn_logic(xpMat, MatrixAccessor<char>(*xpMat), colNum);
case 2: return GetColumn_logic(xpMat, MatrixAccessor<short>(*xpMat), colNum);
case 4: return GetColumn_logic(xpMat, MatrixAccessor<int>(*xpMat), colNum);
case 6: return GetColumn_logic(xpMat, MatrixAccessor<float>(*xpMat), colNum);
case 8: return GetColumn_logic(xpMat, MatrixAccessor<double>(*xpMat), colNum);
default: throw Rcpp::exception("Unknown type detected for big.matrix object!");
}
}
/*** R
bm <- bigmemory::as.big.matrix(as.matrix(reshape2::melt(matrix(c(1:4,NA,6:20),4,5))))
bigmemory:::CGetType([email protected])
bigmemory:::GetCols.bm(bm, 3)
GetColumn([email protected], 2)
*/
谢谢德克,非常感谢您在Rcpp上的所有工作。虽然这样可以得出正确的答案,但我仍然认为如果我可以调用GetMatrixCols函数会更容易 - 不仅因为它被设计用来完成这个确切的操作,还因为我在其他项目中有相似的需求 - > * *需要在我自己的Rcpp代码中调用Rcpp Exported函数。**我创建了一个头文件,其中包含'SEXP GetMatrixCols(SEXP bigMatAddr,SEXP col);'并构建了一个新版本的bigmemory,但是当我sourceCpp:ed:'dyn.load中的错误时..任何想法如何进行或我在做一些非常愚蠢的事情吗? – samssan
Re 1):我认为那是你的错误。那么NA的二进制模式可能无法在强制拷贝从“double”到“int”的情况下存活。只需在输入中创建“双”。 Re 2)和粗体文本。不知道你在说什么。 *使用Rcpp属性的每个*包都可以做到这一点,请参阅Rcpp Atttributes小插曲了解详细信息。重新3)我怀疑你有一个挂包的构建。新问题或发布到rcpp-devel? –
不知道这是否更清楚,但我会试一试。 OtherPackage中有一个cpp函数,它没有在该包的头文件中定义。我需要在cpp级别的MyPackage中使用该函数。我在这里找到了一个类似的问题[链接](http://stackoverflow.com/questions/27079811/how-do-i-share-c-functions-in-rcpp-based-libraries-between-r-packages?rq= 1)。试图暂时遵循这一点。谢谢! – samssan