SEXP getDependencies(SEXP SgraphExtPtr, SEXP Snodes, SEXP Somit, SEXP Sdownstream) { nimbleGraph *graphPtr = static_cast<nimbleGraph *>(R_ExternalPtrAddr(SgraphExtPtr)); vector<int> nodes = SEXP_2_vectorInt(Snodes, -1); // subtract 1 index for C vector<int> omit = SEXP_2_vectorInt(Somit, -1); bool downstream = SEXP_2_bool(Sdownstream); vector<int> ans = graphPtr->getDependencies(nodes, omit, downstream); return(vectorInt_2_SEXP(ans, 1)); // add 1 index for R }
SEXP setGraph(SEXP SedgesFrom, SEXP SedgesTo, SEXP SedgesFrom2ParentExprIDs, SEXP Stypes, SEXP Snames, SEXP SnumNodes) { vector<int> edgesFrom = SEXP_2_vectorInt(SedgesFrom, -1); // -1 subtracted here vector<int> edgesTo = SEXP_2_vectorInt(SedgesTo, -1); // -1 substracted here vector<int> edgesFrom2ParentExprIDs = SEXP_2_vectorInt(SedgesFrom2ParentExprIDs); vector<NODETYPE> types; SEXP_2_nodeType(Stypes, types); vector<string> names; STRSEXP_2_vectorString(Snames, names); int numNodes = SEXP_2_int(SnumNodes); nimbleGraph *newGraph = new nimbleGraph; newGraph->setNodes(edgesFrom, edgesTo, edgesFrom2ParentExprIDs, types, names, numNodes); SEXP SextPtrAns; PROTECT(SextPtrAns = R_MakeExternalPtr(newGraph, R_NilValue, R_NilValue)); R_RegisterCFinalizerEx(SextPtrAns, &nimbleGraphFinalizer, TRUE); UNPROTECT(1); return(SextPtrAns); };
vector<int> getSEXPdims(SEXP Sx) { if(!isNumeric(Sx)) {PRINTF("Error, getSEXPdims called for something not numeric\n"); return(vector<int>());} if(!isVector(Sx)) {PRINTF("Error, getSEXPdims called for something not vector\n"); return(vector<int>());} if(!isArray(Sx) & !isMatrix(Sx)) { vector<int> ans; ans.resize(1); ans[0] = LENGTH(Sx); return(ans); } return(SEXP_2_vectorInt(getAttrib(Sx, R_DimSymbol), 0)); }