SEXP summarise_grouped(const GroupedDataFrame& gdf, List args, const DataDots& dots){ DataFrame df = gdf.data() ; int nexpr = args.size() ; int nvars = gdf.nvars() ; CharacterVector results_names = args.names() ; check_not_groups(results_names, gdf); NamedListAccumulator<SEXP> accumulator ; int i=0; for( ; i<nvars; i++){ SET_NAMED(gdf.label(i), 2) ; accumulator.set( PRINTNAME(gdf.symbol(i)), gdf.label(i) ) ; } LazyGroupedSubsets subsets(gdf) ; Shelter<SEXP> __ ; for( int k=0; k<nexpr; k++, i++ ){ Environment env = dots.envir(k) ; Result* res = get_handler( args[k], subsets, env ) ; // if we could not find a direct Result // we can use a GroupedCalledReducer which will callback to R if( !res ) res = new GroupedCalledReducer( args[k], subsets, env) ; SEXP result = __( res->process(gdf) ) ; SEXP name = results_names[k] ; accumulator.set( name, result ); subsets.input( Symbol(name), SummarisedVariable(result) ) ; delete res; } return summarised_grouped_tbl_cpp(accumulator, gdf ); }
SEXP summarise_grouped(const GroupedDataFrame& gdf, List args, Environment env){ DataFrame df = gdf.data() ; int nexpr = args.size() ; int nvars = gdf.nvars() ; CharacterVector results_names = args.names() ; List out(nexpr + nvars) ; CharacterVector names(nexpr + nvars) ; int i=0; for( ; i<nvars; i++){ out[i] = gdf.label(i) ; SET_NAMED(out[i], 2) ; names[i] = CHAR(PRINTNAME(gdf.symbol(i))) ; } LazyGroupedSubsets subsets(gdf) ; for( int k=0; k<nexpr; k++, i++ ){ Result* res( get_handler( args[k], subsets ) ) ; // if we could not find a direct Result // we can use a GroupedCalledReducer which will callback to R if( !res ) res = new GroupedCalledReducer( args[k], gdf, env) ; out[i] = res->process(gdf) ; names[i] = results_names[k] ; delete res; } return summarised_grouped_tbl_cpp(out, names, gdf ); }