static void initDataFrame()

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