in src/DataFrame.cpp [224:261]
Status RPIServiceImpl::dataFrameGetInfo(ServerContext* context, const RRef* request, DataFrameInfoResponse* response) {
executeOnMainThread([&] {
if (!initDplyr()) return;
DataFrameInfo *info = getDataFrameByRef(request);
if (info == nullptr) return;
ShieldSEXP dataFrame = info->dataFrame;
response->set_canrefresh(bool(info->refresher));
response->set_nrows(asInt(RI->nrow(dataFrame)));
ShieldSEXP names = RI->names(dataFrame);
int ncol = asInt(RI->ncol(dataFrame));
for (int i = 0; i < ncol; ++i) {
DataFrameInfoResponse::Column *columnInfo = response->add_columns();
ShieldSEXP column = RI->doubleSubscript(dataFrame, i + 1);
std::string cls = getClasses(column);
const char* name = stringEltUTF8(names, i);
if (!strcmp(name, ROW_NAMES_COL)) {
columnInfo->set_isrownames(true);
} else {
columnInfo->set_name(name);
}
if (cls == "integer") {
columnInfo->set_type(DataFrameInfoResponse::INTEGER);
columnInfo->set_sortable(true);
} else if (cls == "numeric") {
columnInfo->set_type(DataFrameInfoResponse::DOUBLE);
columnInfo->set_sortable(true);
} else if (cls == "logical") {
columnInfo->set_type(DataFrameInfoResponse::BOOLEAN);
columnInfo->set_sortable(true);
} else {
columnInfo->set_type(DataFrameInfoResponse::STRING);
columnInfo->set_sortable(cls == "character" || Rf_inherits(column, "factor") ||
Rf_inherits(column, "POSIXt"));
}
}
}, context, true);
return Status::OK;
}