最近我有一个bug,当修复它时,我想知道是否可以返回一个VECsXP(即R列表类型),其中元素被命名。此C++代码:
SEXP do_bla()
{
int prtCnt = 0;
SEXP a = PROTECT(allocMatrix(REALSXP, 5, 5));
prtCnt++;
SEXP b = PROTECT(allocVector(REALSXP, 5));
prtCnt++;
SEXP OS = PROTECT(allocVector(VECSXP, 2));
prtCnt++;
SET_VECTOR_ELT(OS, 0, a);
SET_VECTOR_ELT(OS, 1, b);
UNPROTECT(prtCnt);
return OS;
}
会给我一个r中两个元素(矩阵和向量)的列表:
s <- .Call("do_bla", ....)
可按如下方式编制索引:
s[[1]]; s[[2]]
为了实现这一点,我需要做些什么:
s$a; s$b
或者这是不可能的?
最佳答案
见Writing R Extensions第5.9.4节。分配并填充一个名称向量,并在列表上设置names属性。
library(inline)
named <- cfunction(signature(), '
/* allocate and populate list */
SEXP OS = PROTECT(allocVector(VECSXP, 2));
SET_VECTOR_ELT(OS, 0, allocMatrix(REALSXP, 5, 5));
SET_VECTOR_ELT(OS, 1, allocVector(REALSXP, 5));
/* create names */
SEXP nms = PROTECT(allocVector(STRSXP, 2));
SET_STRING_ELT(nms, 0, mkChar("foo"));
SET_STRING_ELT(nms, 1, mkChar("bar"));
/* assign names to list */
setAttrib(OS, R_NamesSymbol, nms);
/* cleanup and return */
UNPROTECT(2);
return OS;')