是否可以通过Rcpp访问R的原始“类”功能?

时间:2016-11-24 13:10:00

标签: r rcpp

我正在尝试循环遍历R列表并提取列表中每个R对象的主类(在S3类的情况下定义为第一个元素)。我知道可以从Rcpp调用泛型R函数,但我想避免这样做。我开始追求这个的原因是为了表现。

我在这里看到了另一个关于访问R原始函数的问题: use primitive functions in Rcpp看起来Rcpp的糖表达式解决了这一特定问题,但看起来Rcpp糖中没有“类”。

我知道可以访问Rcpp中的属性(这是S3类的存储方式),而且我也知道在Rcpp中可以检测到S4对象,所以我认为可能有办法做到这一点,但它最简单原始类函数可以直接调用,我只是遗漏了一些东西。

library(Rcpp)

objList <- list(
    a = 10,
    b = lm(mpg~cyl, data = mtcars),
    c = glm(mpg~cyl, data = mtcars, family = gaussian)
)
##R approach
primaryClass <- function(x){
    class(x)[1]
}

vapply(objList, primaryClass, character(1))

##Rcpp skeleton approach
cppFunction('CharacterVector primaryClass(List x) {
  int nrow = x.size();
  CharacterVector out(nrow);
  for (int i = 0; i < nrow; i++) {
    out[i] = "classHere";
  }
  return out;
}')

primaryClass(objList)

1 个答案:

答案 0 :(得分:2)

并非R&#34;所有&#34;内部可供Rcpp使用。当然没有自动机制(这就是为什么你引用的max()上的答案显示了不同但等效的max()函数)。

但你可以查看class属性(包含S3):

R> cppFunction('std::string getClass(RObject x) { 
+      if (x.hasAttribute("class")) return x.attr("class"); else return ""; }')
R> getClass(lm.D9)         # after running `example(lm)` to get `lm.D9`
[1] "lm"
R> getClass(2.345)
[1] ""
R>

同样,您可以测试其他对象类型并添加逻辑。