我通过调用 C 代码.Call("foo", <args>)
,其中 foo 调用其他 C 函数,计算结果并返回它。结果是一个长度为 3 的列表,我想命名这个列表。为此, foo 这样做:
/* Construct result list from variables containing the results */
SEXP res = PROTECT(allocVector(VECSXP, 3)); /* list of length 3 */
SET_VECTOR_ELT(res, 0, ScalarReal(a)); /* numeric(1) */
SET_VECTOR_ELT(res, 1, somenumericvector); /* numeric(<some length>) */
SET_VECTOR_ELT(res, 2, ScalarInteger(i)); /* integer(1) */
/* Name components and return */
SEXP nms = PROTECT(allocVector(STRSXP, 3)); /* names as SEXP */
char *nms_ = CHAR(STRING_ELT(nms, 0)); /* pointer to names */
char *names[3] = {"result_numeric", "result_numeric_vector", "result_integer"};
for(i = 0; i < 3; i++) nms_[i] = names[i];
setAttrib(res, R_NamesSymbol, nms);
UNPROTECT(1);
return res;
这是构造长度为 3 的命名列表的正确方法吗?
C 函数确实返回到 R,但是一旦我将输出分配给 R 中的变量,我立即得到分段错误。可能有什么问题?我可以在上面的'return res;'之前放置'debug statement's(简单printf("...\n")
)并且它们执行得很好。有没有方便的方法来调试从R调用的C代码?