Изменить размер вектора с R's C API

Я выделяю вектор R, используя allocVector в функции C вызывается с .Call от R. Можно ли изменить размер / длину вектора после его выделения? То есть похоже на то, как realloc работает в кл.

В коде я ищу функцию 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 ответ

Решение

Кажется, что SETLENGTH макрос, определенный в Rinternals.h header - лучший выбор для решения этой проблемы. То есть:

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;
}
Другие вопросы по тегам