使用R的C API更改向量的大小

时间:2017-03-03 05:16:23

标签: r r-package r-extension

我在使用来自R的allocVector调用的C函数中使用.Call分配R向量。是否可以在分配后更改向量的大小/长度?即,类似于realloc在C中的工作方式。

在代码中,我正在寻找函数reallocVector,以便以下函数执行相同的操作。

SEXP my_function1(SEXP input){
    SEXP R_output = PROTECT(allocVector(REALSXP, 100));

    // Do some work on R_output

    // Keep only the first 50 items
    reallocVector(R_output, 50); 

    UNPROTECT(1);
    return R_output;
}

SEXP my_function1(SEXP input){
    SEXP tmp_output = PROTECT(allocVector(REALSXP, 100));

    // Do the same work on tmp_output

    // Keep only the first 50 items
    SEXP R_output = PROTECT(allocVector(REALSXP, 50));
    for (int i = 0; i < 50; ++i) {
        REAL(R_output)[i] = REAL(tmp_output)[i];
    }

    UNPROTECT(2);
    return R_output;
}

1 个答案:

答案 0 :(得分:0)

似乎SETLENGTH标头中定义的Rinternals.h宏是解决此问题的最佳选择。即:

SEXP my_function1(SEXP input){
    SEXP R_output = PROTECT(allocVector(REALSXP, 100));

    // Do some work on R_output

    // Keep only the first 50 items
    SETLENGTH(R_output, 50);

    UNPROTECT(1);
    return R_output;
}