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