gpt4 book ai didi

c - 编写 R 扩展时如何返回命名的 VECSXP

转载 作者:太空狗 更新时间:2023-10-29 15:15:50 26 4
gpt4 key购买 nike

最近我有一个错误,在修复它时我想知道是否可以返回一个 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 中的两个元素(矩阵和 vector )的列表:

s <- .Call("do_bla", ....)

可以这样索引:

 s[[1]]; s[[2]]

为了使这成为可能,我需要更改什么:

s$a; s$b

或者这是不可能的?

最佳答案

参见 Writing R Extensions 的第 5.9.4 节.分配并填充名称 vector ,并在列表中设置名称属性。

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;')

关于c - 编写 R 扩展时如何返回命名的 VECSXP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38338270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com