用 R 的 C API 改变向量的大小
Change size of vector with R's C API
我在用 .Call
从 R 调用的 C 函数中使用 allocVector
分配 R 向量。是否可以在向量被分配后更改向量的 size/length分配?即,类似于 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;
}
似乎在Rinternals.h
头文件中定义的SETLENGTH
宏是解决这个问题的最佳选择。即:
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;
}
我在用 .Call
从 R 调用的 C 函数中使用 allocVector
分配 R 向量。是否可以在向量被分配后更改向量的 size/length分配?即,类似于 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;
}
似乎在Rinternals.h
头文件中定义的SETLENGTH
宏是解决这个问题的最佳选择。即:
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;
}