new data frame primitives seem more usable in functions