in src/DataFrame.cpp [69:114]
static void initDataFrame(DataFrameInfo *info) {
PrSEXP dataFrame = info->initialDataFrame;
info->equalityVector = getEqualityVector(dataFrame);
getDataFrameStorageEnv().assign(std::to_string(info->uniqueIndex), dataFrame);
if (Rf_isMatrix(dataFrame)) {
dataFrame = RI->dataFrame(dataFrame, named("stringsAsFactors", false));
}
if (!isDataFrameJb(dataFrame)) {
RI->stop("Object is not a valid data frame");
}
int ncol = asInt(RI->ncol(dataFrame));
dataFrame = Rf_duplicate(dataFrame);
for (int i = 0; i < ncol; ++i) {
if (Rf_inherits(dataFrame[i], "POSIXlt")) {
SET_VECTOR_ELT(dataFrame, i, RI->asPOSIXct(dataFrame[i]));
}
}
ShieldSEXP namesList = RI->names(dataFrame);
std::vector<std::string> names(ncol);
for (int i = 0; i < ncol; ++i) {
names[i] = i < namesList.length() && !namesList.isNA(i) ? stringEltUTF8(namesList, i) : "";
if (names[i].empty()) names[i] = "Column " + std::to_string(i + 1);
}
dataFrame = RI->namesAssign(dataFrame, names);
if (asBool(RI->dplyrIsTbl(dataFrame))) {
dataFrame = RI->dplyrUngroup(dataFrame);
} else {
if (!asBool(RI->isDataFrame(dataFrame))) {
dataFrame = RI->dataFrame(dataFrame, named("stringsAsFactors", false));
}
// `rownames = NA` keep row names
dataFrame = RI->tibbleAsTibble(dataFrame, named("rownames", R_NaInt));
}
dataFrame = RI->tibbleRowNamesToColumn(dataFrame, ROW_NAMES_COL);
ShieldSEXP rowNamesColumn = RI->doubleSubscript(dataFrame, ROW_NAMES_COL);
PrSEXP rowNamesAsNum = RI->strtoi(rowNamesColumn); // As integer (but not numeric)
if (asBool(RI->any(RI->isNa(rowNamesAsNum)))) {
rowNamesAsNum = RI->asNumeric(rowNamesColumn); // As numeric
}
if (!asBool(RI->any(RI->isNa(rowNamesAsNum)))) {
dataFrame = RI->doubleSubscriptAssign(dataFrame, ROW_NAMES_COL, named("value", rowNamesAsNum));
}
info->dataFrame = dataFrame;
}