Ejemplo n.º 1
0
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);
 }
Ejemplo n.º 2
0
// [[Rcpp::export]]
CharacterVector integer_names_get( IntegerVector y ){
    return y.names() ;
}
Ejemplo n.º 3
0
// [[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;
}