C R包开发:如何检查SEXP的类型是否为;“大.矩阵”吗;?

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代码开发一个R包。假设我的
C
代码中有以下函数

SEXP myFun(SEXP obj)
我需要知道R对象
obj
是常规
矩阵
还是
big.matrix
(使用R包
bigmemory
),以便调用不同的函数进行计算

这可能吗?如何知道<代码> OBJ ?< /P> < P>的类类型:如果你对C++(而不是C)开放,那么我们有两个帖子:

狭义的答案可能是测试S4类中的外部指针
SEXP
。。。但是,我不再做普通的C了,因为Rcpp让事情变得简单很多。

< P>如果你对C++(而不是C)开放,那么我们有两个帖子:

狭义的答案可能是测试S4类中的外部指针
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()