IntegerVector downstreamCpp(IntegerMatrix AM, CharacterVector nodeNames, CharacterVector index){ int nN = nodeNames.size(); int nIndex = index.size(); IntegerVector whN = match(index, nodeNames); bool miss = is_true(any(is_na(whN))); if (miss) stop ("unmatched node provided"); IntegerVector rval(index.size(),0); // len celkovy pocet bez konkretnych vysledkov for (int i=0; i < nIndex; i++) { IntegerVector marked(nN); IntegerVector distv(nN); marked.names() = nodeNames; distv.names() = nodeNames; int distx = 1; int newmk = 0; String current = index[i]; marked[current] = 1; bool done = false; while(!done) { LogicalVector selN = marked==1; CharacterVector minds = nodeNames[selN]; //Rf_PrintValue(marked); //Rf_PrintValue(minds); for (int j=0; j<minds.size(); j++ ) { // CharacterVector nodeS = minds(j); int node = match(minds, nodeNames)(j); IntegerVector avec = AM(node-1,_); avec.names() = nodeNames; LogicalVector discard = is_na(match(nodeNames,index)); avec[discard] = 0; LogicalVector discard2 = (marked != 0) & (avec == 1); avec[discard2] = 0; LogicalVector avecFin = avec==1; CharacterVector avecNames = nodeNames[avecFin]; //Rf_PrintValue(avec); marked[avecNames] = 1; distv[avecNames] = distx; } marked[minds] = 2; distx++; newmk = sum(marked == 1); if (newmk == 0) done = true; } marked[current] = 0; rval[i] = sum(marked==2); } rval.names()=index; return(rval); }
// [[Rcpp::export]] CharacterVector integer_names_get( IntegerVector y ){ return y.names() ; }
// [[Rcpp::export]] SEXP combine_vars(CharacterVector vars, ListOf<IntegerVector> xs) { VarList selected(vars.size()); if (xs.size() == 0) return IntegerVector::create(); // Workaround bug in ListOf<>; can't access attributes SEXP raw_names = Rf_getAttrib(xs, Rf_mkString("names")); CharacterVector xs_names; if (raw_names == R_NilValue) { xs_names = CharacterVector(xs.size(), "" ); } else { xs_names = raw_names ; } // If first component is negative, pre-fill with existing vars if (vector_sign(xs[0]) == -1) { for (int j = 0; j < vars.size(); ++j) { selected.add(j + 1, vars[j]); } } for (int i = 0; i < xs.size(); ++i) { IntegerVector x = xs[i]; if (x.size() == 0) continue; int sign = vector_sign(x); if (sign == 0) stop("Each argument must yield either positive or negative integers"); if (sign == 1) { bool group_named = xs_names[i] != ""; bool has_names = x.attr("names") != R_NilValue; if (group_named) { if (x.size() == 1) { selected.update(x[0], xs_names[i]); } else { // If the group is named, children are numbered sequentially for (int j = 0; j < x.size(); ++j) { std::stringstream out; out << xs_names[i] << j + 1; selected.update(x[j], out.str()); } } } else if (has_names) { CharacterVector names = x.names() ; for (int j = 0; j < x.size(); ++j) { selected.update(x[j], names[j]); } } else { for (int j = 0; j < x.size(); ++j) { int pos = x[j]; if (pos < 1 || pos > vars.size()) stop("Position must be between 0 and n"); // Add default name, if not all ready present if (!selected.has(pos)) selected.update(pos, vars[pos - 1]); } } } else { for (int j = 0; j < x.size(); ++j) { selected.remove(-x[j]); } } } return selected; }