C R包开发:如何检查SEXP的类型是否为;“大.矩阵”吗;?
我正在用低级C代码开发一个R包。假设我的C R包开发:如何检查SEXP的类型是否为;“大.矩阵”吗;?,c,r,r-bigmemory,C,R,R Bigmemory,我正在用低级C代码开发一个R包。假设我的C代码中有以下函数 SEXP myFun(SEXP obj) 我需要知道R对象obj是常规矩阵还是big.matrix(使用R包bigmemory),以便调用不同的函数进行计算 这可能吗?如何知道 OBJ ?< /P> < P>的类类型:如果你对C++(而不是C)开放,那么我们有两个帖子: 狭义的答案可能是测试S4类中的外部指针SEXP。。。但是,我不再做普通的C了,因为Rcpp让事情变得简单很多。 < P>如果你对C++(而不是C)开放,那么我
C
代码中有以下函数
SEXP myFun(SEXP obj)
我需要知道R对象obj
是常规矩阵
还是big.matrix
(使用R包bigmemory
),以便调用不同的函数进行计算
这可能吗?如何知道<代码> OBJ ?< /P> < P>的类类型:如果你对C++(而不是C)开放,那么我们有两个帖子:
SEXP
。。。但是,我不再做普通的C了,因为Rcpp让事情变得简单很多。 < P>如果你对C++(而不是C)开放,那么我们有两个帖子:
SEXP
。。。但是,我不再真正使用纯C,因为Rcpp使事情变得更加简单。您可以使用以下函数:
#include <R.h>
#include <Rinternals.h>
SEXP myFun(SEXP obj) {
if (inherits(obj, "big.memory")) {
// do stuff
}
}
#包括
#包括
SEXP myFun(SEXP obj){
if(继承(obj,“big.memory”)){
//做事
}
}
您可以使用以下功能:
#include <R.h>
#include <Rinternals.h>
SEXP myFun(SEXP obj) {
if (inherits(obj, "big.memory")) {
// do stuff
}
}
#包括
#包括
SEXP myFun(SEXP obj){
if(继承(obj,“big.memory”)){
//做事
}
}
非常感谢您开发Rcpp
,德克。我正在学习Rcpp
,并使用它处理big.matrix
的计算。我的问题是,我正在扩展一个现有的R包,其中算法已经用C实现。我只需要编写代码来处理big.matrix
部分。这不是一个约束。你可以在C内核上写同样多的(或很少的)C++。记住R本身也是一个C(和一些Fortran)程序。总之,这里也要使用Rcpp。这会让你的任务更容易。谢谢你的指导,德克。如果我可以在C/C++级别检查SEXP
的类类型,那么我可以使用Rcpp
来处理big.matrix
,其余的则使用现有的C
代码。但我仍然不清楚你的建议如何解决这个问题。如果可能的话,你能用更多的细节修改你的答案吗,这样我就可以接受你的答案了?这些都在画廊的帖子里,以前也做过。是的,你可以检查SEXP类型。是的,您可以检查attr()
。对于初学者,您不会使用sexpfoo(sexpx)
,而是使用类型——例如Rcpp::XPtr
。谢谢。那真的很有帮助!!非常感谢您开发Rcpp
,德克。我正在学习Rcpp
,并使用它处理big.matrix
的计算。我的问题是,我正在扩展一个现有的R包,其中算法已经用C实现。我只需要编写代码来处理big.matrix
部分。这不是一个约束。你可以在C内核上写同样多的(或很少的)C++。记住R本身也是一个C(和一些Fortran)程序。总之,这里也要使用Rcpp。这会让你的任务更容易。谢谢你的指导,德克。如果我可以在C/C++级别检查SEXP
的类类型,那么我可以使用Rcpp
来处理big.matrix
,其余的则使用现有的C
代码。但我仍然不清楚你的建议如何解决这个问题。如果可能的话,你能用更多的细节修改你的答案吗,这样我就可以接受你的答案了?这些都在画廊的帖子里,以前也做过。是的,你可以检查SEXP类型。是的,您可以检查attr()
。对于初学者,您不会使用sexpfoo(sexpx)
,而是使用类型——例如Rcpp::XPtr
。谢谢。那真的很有帮助!!谢谢你,凯文。这正是我最终得到的结果。很好,如果你最终得到的是Rcpp头,这将成为Rf\u inherits()
。谢谢Kevin。这正是我最终得到的结果。很好,如果你最终得到的是Rcpp头,这将成为Rf\u inherits()
。