我正在使用C中的R internals接口。我需要从C分析SEXP的内容,但我不知道确切的SEXP结构。是否有一种简单的方法(或一些现有的代码),我可以根据低级C对象将SEXP转储到控制台或文件?
答案 0 :(得分:3)
你可以从R调用一个内部函数inspect
,例如
x <- list(1, 2, 3)
.Internal(inspect(x))
这给出了
@7fd37292f970 19 VECSXP g0c3 [NAM(2)] (len=3, tl=0)
@7fd370b9bd28 14 REALSXP g0c1 [NAM(2)] (len=1, tl=0) 1
@7fd370b9bcf8 14 REALSXP g0c1 [NAM(2)] (len=1, tl=0) 2
@7fd370b9bcc8 14 REALSXP g0c1 [NAM(2)] (len=1, tl=0) 3
您可以使用以下内容从C / C ++中调用它:
#define R_NO_REMAP
#include <R.h>
#include <Rinternals.h>
void inspect(SEXP x) {
SEXP inspectCall = PROTECT(Rf_lang2(Rf_install("inspect"), x));
SEXP dotInternalCall = PROTECT(Rf_lang2(Rf_install(".Internal"), inspectCall));
Rf_eval(dotInternalCall, R_GlobalEnv);
UNPROTECT(2);
}
您还可以查看Rf_PrintValue
,这是一种调用print()
的机制。