Изменить размер вектора с 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;
}