2015-09-27 71 views
1

我正在开发一个带有低级C代码的R包。假设我在我的C代码中有以下功能。R包开发:如何检查SEXP的类型是否是“big.matrix”?

SEXP myFun(SEXP obj) 

我需要知道将R对象obj是否为正规matrixbig.matrix(使用ř包bigmemory),这样我可以调用不同的函数进行计算。

这可能吗?我怎么知道obj的班级类型?

回答

2

可以使用inherits功能:

#include <R.h> 
#include <Rinternals.h> 

SEXP myFun(SEXP obj) { 
    if (inherits(obj, "big.memory")) { 
     // do stuff 
    } 
} 
+0

谢谢凯文。这正是我最终的结果。 –

+0

不错,如果你最终得到Rcpp头文件,它会变成'Rf_inherits()'。 –

2

如果你打开C++(而不是C),那么我们有你们两个Rcpp Gallery帖子:

狭窄的答案很可能是测试外部指针SEXP在S4类中......但是我不再真正地使用普通的C语言,因为Rcpp使事情变得如此简单。

+0

非常感谢您为开发''Rcpp'',德克。我正在学习''Rcpp'',并用它来处理''big.matrix''的计算。我的问题是我正在扩展现有的R包,其中的算法已经在C中实现。我只需要编写代码来处理big.matrix部分。 –

+0

这是*不*约束。你可以在内核C核上编写尽可能多的(或很少)C++。请记住,R本身也是C(和一些Fortran)程序。所以在这里也使用Rcpp。它应该让你的任务更容易。 –

+0

感谢您的指导,Dirk。如果我可以在C/C++级别检查“SEXP”的类类型,那么我可以使用Rcpp来处理big.matrix,并使用现有的C代码。但我仍不清楚你的建议如何解决这个问题。如果可能的话,你能否用更多的细节修改你的答案,以便我能接受你的答案? –

相关问题