/// <summary> /// Create an R data frame from managed arrays and objects. /// </summary> /// <param name="engine">R engine</param> /// <param name="columns">The columns with the values for the data frame. These must be array of supported types (double, string, bool, integer, byte)</param> /// <param name="columnNames">Column names. default: null.</param> /// <param name="rowNames">Row names. Default null.</param> /// <param name="checkRows">Check rows. See data.frame R documentation</param> /// <param name="checkNames">See data.frame R documentation</param> /// <param name="stringsAsFactors">Should columns of strings be considered as factors (categories). See data.frame R documentation</param> /// <returns></returns> public static DataFrame CreateDataFrame(this REngine engine, IEnumerable[] columns, string[] columnNames = null, string[] rowNames = null, bool checkRows = false, bool checkNames = true, bool stringsAsFactors = true) { var df = engine.GetSymbol("data.frame").AsFunction(); SymbolicExpression[] colVectors = ToVectors(engine, columns); Tuple <string, SymbolicExpression>[] namedColArgs = CreateNamedArgs(colVectors, columnNames); var args = new List <Tuple <string, SymbolicExpression> >(namedColArgs); if (rowNames != null) { args.Add(Tuple.Create("row.names", (SymbolicExpression)engine.CreateCharacterVector(rowNames))); } args.Add(Tuple.Create("check.rows", (SymbolicExpression)engine.CreateLogical(checkRows))); args.Add(Tuple.Create("check.names", (SymbolicExpression)engine.CreateLogical(checkNames))); args.Add(Tuple.Create("stringsAsFactors", (SymbolicExpression)engine.CreateLogical(stringsAsFactors))); var result = df.InvokeNamed(args.ToArray()).AsDataFrame(); return(result); }