Joe Conway wrote:
Yes, if I patch RNamedCall.c with the attached (based on your function), everything seems to work.
Sorry -- I managed to mess up that patch. This one should be better. Joe
*** ../../../R-2.5.1/tests/Embedding/RNamedCall.c Mon Sep 4 07:21:12 2006 --- RNamedCall.c Fri Jul 6 10:19:46 2007 *************** *** 2,7 **** --- 2,9 ---- void bar1() ; void source(const char *name); + static SEXP MyfindFun(SEXP symb, SEXP envir); + /* Creates and evaluates a call to a function giving named arguments *************** *** 51,58 **** SEXP e; PROTECT(e = allocVector(LANGSXP, 4)); ! fun = findFun(install("foo"), R_GlobalEnv); ! if(fun == R_NilValue) { fprintf(stderr, "No definition for function foo. Source foo.R and save the session.\n"); UNPROTECT(1); exit(1); --- 53,60 ---- SEXP e; PROTECT(e = allocVector(LANGSXP, 4)); ! fun = MyfindFun(install("foo"), R_GlobalEnv); ! if(fun == R_UnboundValue) { fprintf(stderr, "No definition for function foo. Source foo.R and save the session.\n"); UNPROTECT(1); exit(1); *************** *** 80,82 **** --- 82,104 ---- UNPROTECT(1); } + static SEXP + MyfindFun(SEXP symb, SEXP envir) + { + SEXP fun; + SEXPTYPE t; + fun = findVar(symb,envir); + t = TYPEOF(fun); + + /* eval promise if need be */ + if (t == PROMSXP){ + int error=1; + fun = R_tryEval(fun,envir,&error); + if (error) return R_UnboundValue; + t = TYPEOF(fun); + } + + if (t == CLOSXP || t == BUILTINSXP || t == BUILTINSXP || t == SPECIALSXP) + return fun; + return R_UnboundValue; + }
______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel