Status RPIServiceImpl::dataFrameGetData()

in src/DataFrame.cpp [263:314]


Status RPIServiceImpl::dataFrameGetData(ServerContext* context, const DataFrameGetDataRequest* request, DataFrameGetDataResponse* response) {
  executeOnMainThread([&] {
    if (!initDplyr()) return;
    DataFrameInfo *info = getDataFrameByRef(&request->ref());
    if (info == nullptr) return;
    ShieldSEXP dataFrame = info->dataFrame;
    int start = request->start();
    int end = request->end();
    int ncol = asInt(RI->ncol(dataFrame));
    for (int i = 0; i < ncol; ++i) {
      DataFrameGetDataResponse::Column* columnProto = response->add_columns();
      ShieldSEXP wholeColumn = RI->doubleSubscript(dataFrame, i + 1);
      ShieldSEXP column = RI->subscript(wholeColumn, RI->colon(start + 1, end));
      std::string cls = getClasses(column);
      if (cls == "integer") {
        for (int j = 0; j < column.length(); ++j) {
          if (column.isNA(j)) {
            columnProto->add_values()->mutable_na();
          } else {
            columnProto->add_values()->set_intvalue(asInt(column[j]));
          }
        }
      } else if (cls == "numeric") {
        for (int j = 0; j < column.length(); ++j) {
          if (column.isNA(j)) {
            columnProto->add_values()->mutable_na();
          } else {
            columnProto->add_values()->set_doublevalue(asDouble(column[j]));
          }
        }
      } else if (cls == "logical") {
        for (int j = 0; j < column.length(); ++j) {
          if (column.isNA(j)) {
            columnProto->add_values()->mutable_na();
          } else {
            columnProto->add_values()->set_booleanvalue(asBool(column[j]));
          }
        }
      } else {
        for (int j = 0; j < column.length(); ++j) {
          if (column.isNA(j)) {
            columnProto->add_values()->mutable_na();
          } else {
            columnProto->add_values()->set_stringvalue(
              asStringUTF8(RI->paste(RI->doubleSubscript(column, j + 1), named("collapse", "; "))));
          }
        }
      }
    }
  }, context, true);
  return Status::OK;
}