将SEXP结构转储到控制台

时间:2015-10-12 18:01:20

标签: c r

我正在使用C中的R internals接口。我需要从C分析SEXP的内容,但我不知道确切的SEXP结构。是否有一种简单的方法(或一些现有的代码),我可以根据低级C对象将SEXP转储到控制台或文件?

1 个答案:

答案 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()的机制。