package water.rapids.ast.prims.mungers; import water.DKV; import water.fvec.Frame; import water.rapids.Env; import water.rapids.Val; import water.rapids.ast.AstRoot; import water.rapids.vals.ValFrame; import water.rapids.ast.AstPrimitive; import water.rapids.ast.params.AstNum; import water.rapids.ast.params.AstNumList; import water.rapids.ast.params.AstStrList; /** * Assign column names */ public class AstColNames extends AstPrimitive { @Override public String[] args() { return new String[]{"ary", "cols", "names"}; } @Override public int nargs() { return 1 + 3; } // (colnames frame [#cols] ["names"]) @Override public String str() { return "colnames="; } @Override public ValFrame apply(Env env, Env.StackHelp stk, AstRoot asts[]) { Frame fr = stk.track(asts[1].exec(env)).getFrame(); if (asts[2] instanceof AstNumList) { if (!(asts[3] instanceof AstStrList)) throw new IllegalArgumentException("Column naming requires a string-list, but found a " + asts[3].getClass()); AstNumList cols = ((AstNumList) asts[2]); AstStrList nams = ((AstStrList) asts[3]); int d[] = cols.expand4(); if (d.length != nams._strs.length) throw new IllegalArgumentException("Must have the same number of column choices as names"); for (int i = 0; i < d.length; i++) fr._names[d[i]] = nams._strs[i]; } else if ((asts[2] instanceof AstNum)) { int col = (int) (asts[2].exec(env).getNum()); String name = asts[3].exec(env).getStr(); fr._names[col] = name; } else throw new IllegalArgumentException("Column naming requires a number-list, but found a " + asts[2].getClass()); if (fr._key != null) DKV.put(fr); // Update names in DKV return new ValFrame(fr); } }