最近我有一个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;')

10-07 19:44
查看更多