Status RPIServiceImpl::dataFrameGetInfo()

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;
}