gpt4 book ai didi

c++ - 在 C/C++ 中创建 R 数据框

转载 作者:太空狗 更新时间:2023-10-29 20:10:47 28 4
gpt4 key购买 nike

我正在尝试制作一个 data.frame 以从 C/C++ 代码传递到 R 代码(我没有使用 Rcpp,我想从第一原则使用 R c-api,原因与此处无关)

我知道如何制作一个 double vector 并加载数据(对于我的示例,这里只是虚拟数据)

SEXP col1;
Rf_protect(col1= Rf_allocVector(REALSXP, 10);
for (size_t j = 0; j < 10; j++)
{
double dval = static_cast<double(j*3.14);
REAL(col1)[static_cast<int>(j)] = dval;
}
SEXP nameSym = Rf_install(const_cast<char*>("myColumn1"));
Rf_defineVar(nameSym, col1, _R_GlobalEnv);

这使得在 R 中我可以做

Y <- mean(myColumn1)

但我真正想做的是拥有一个包含超过 1 列的数据框

SEXP col1;
SEXP col2;
Rf_protect(col1= Rf_allocVector(REALSXP, 10);
Rf_protect(col2 = Rf_allocVector(REALSXP, 10);
for (size_t j = 0; j < 10; j++)
{
double dval1 = static_cast<double(j*3.14);
double dval2 = static_cast<double(j*42.0);
REAL(col1)[static_cast<int>(j)] = dval1;
REAL(col2)[static_cast<int>(j)] = dval2;
}
SEXP nameSym1 = Rf_install(const_cast<char*>("myColumn1"));
SEXP nameSym2 = Rf_install(const_cast<char*>("myColumn2"));
Rf_defineVar(nameSym1, col1, _R_GlobalEnv);
Rf_defineVar(nameSym2, col2, _R_GlobalEnv);

.... data.frame?

理想情况下,我想将 myColumn1 和 myColumn2 放入数据框(“myData”)中,这样我就可以做到

Y <- mean(myData$myColumn1)
Z <- min(myData$myColumn2)

有人知道如何构建数据框吗?

任何指针都会有帮助

最佳答案

您需要分配一个VECSXP并设置它的“names”/“class”/“row.names”属性:

ff = inline::cfunction(sig = c(), body = '
SEXP col1;
SEXP col2;
Rf_protect(col1= Rf_allocVector(REALSXP, 10));
Rf_protect(col2 = Rf_allocVector(REALSXP, 10));
for (size_t j = 0; j < 10; j++) {
double dval1 = static_cast<double>(j*3.14);
double dval2 = static_cast<double>(j*42.0);
REAL(col1)[static_cast<int>(j)] = dval1;
REAL(col2)[static_cast<int>(j)] = dval2;
}
//SEXP nameSym1 = Rf_install(const_cast<char*>("myColumn1"));
//SEXP nameSym2 = Rf_install(const_cast<char*>("myColumn2"));
//Rf_defineVar(nameSym1, col1, R_GlobalEnv);
//Rf_defineVar(nameSym2, col2, R_GlobalEnv);
SEXP ans = PROTECT(allocVector(VECSXP, 2)),
nms = PROTECT(allocVector(STRSXP, 2)),
rnms = PROTECT(allocVector(INTSXP, 2));

SET_STRING_ELT(nms, 0, mkChar("myColumn1"));
SET_STRING_ELT(nms, 1, mkChar("myColumn2"));

SET_VECTOR_ELT(ans, 0, col1);
SET_VECTOR_ELT(ans, 1, col2);

INTEGER(rnms)[0] = NA_INTEGER;
INTEGER(rnms)[1] = -10;

setAttrib(ans, R_ClassSymbol, ScalarString(mkChar("data.frame")));
setAttrib(ans, R_RowNamesSymbol, rnms);
setAttrib(ans, R_NamesSymbol, nms);

UNPROTECT(5);
return(ans);
')

str(ff())
#'data.frame': 10 obs. of 2 variables:
# $ myColumn1: num 0 3.14 6.28 9.42 12.56 ...
# $ myColumn2: num 0 42 84 126 168 210 252 294 336 378

关于c++ - 在 C/C++ 中创建 R 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37069149/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com