// [[Rcpp::export]] IntegerVector grouped_indices_grouped_df_impl(GroupedDataFrame gdf) { int n=gdf.nrows(); IntegerVector res = no_init(n); int ngroups = gdf.ngroups(); GroupedDataFrameIndexIterator it = gdf.group_begin(); for (int i=0; i<ngroups; i++, ++it) { SlicingIndex index = *it; int n_index = index.size(); for (int j=0; j<n_index; j++) { res[ index[j] ] = i + 1; } } return res; }
SEXP mutate_grouped(GroupedDataFrame gdf, List args, const DataDots& dots){ const DataFrame& df = gdf.data() ; int nexpr = args.size() ; CharacterVector results_names = args.names() ; check_not_groups(results_names, gdf); Environment env = dots.envir(0) ; GroupedCallProxy proxy(gdf, env) ; Shelter<SEXP> __ ; NamedListAccumulator<SEXP> accumulator ; int ncolumns = df.size() ; CharacterVector column_names = df.names() ; for( int i=0; i<ncolumns; i++){ accumulator.set( column_names[i], df[i] ) ; } for( int i=0; i<nexpr; i++){ env = dots.envir(i) ; proxy.set_env( env ) ; SEXP call = args[i] ; SEXP name = results_names[i] ; SEXP variable = R_NilValue ; if( TYPEOF(call) == SYMSXP ){ if(proxy.has_variable(call)){ variable = proxy.get_variable( PRINTNAME(call) ) ; } else { SEXP v = env.find(CHAR(PRINTNAME(call))) ; if( Rf_isNull(v) ){ std::stringstream s ; s << "unknown variable: " << CHAR(PRINTNAME(call)) ; stop(s.str()); } else if( Rf_length(v) == 1){ Replicator* rep = constant_replicator(v, gdf.nrows() ); variable = __( rep->collect() ); delete rep ; } else { Replicator* rep = replicator(v, gdf) ; variable = __( rep->collect() ); delete rep ; } } } else if(TYPEOF(call) == LANGSXP){ proxy.set_call( call ); Gatherer* gather = gatherer( proxy, gdf ) ; variable = __( gather->collect() ) ; delete gather ; } else if(Rf_length(call) == 1) { boost::scoped_ptr<Gatherer> gather( constant_gatherer( call, gdf.nrows() ) ); variable = __( gather->collect() ) ; } else { stop( "cannot handle" ) ; } proxy.input( name, variable ) ; accumulator.set( name, variable) ; } return structure_mutate(accumulator, df, classes_grouped() ); }