我正在尝试循环遍历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)
答案 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>
同样,您可以测试其他对象类型并添加逻辑。