Re: [Rd] R-2.0.0 findVar and findFun question

From: Matjaz Kukar <matjaz.kukar_at_fri.uni-lj.si>
Date: Sat 09 Oct 2004 - 06:53:07 EST

Prof Brian Ripley wrote:

> On Fri, 8 Oct 2004, Matjaz Kukar wrote:
>
>

>>Dear all,
>>
>>when working on a project with embedded R, I found out that R-2.0.0 causes
>>a problem where older versions worked OK.
>>
>>Rf_findVar(...) causes the following error when used to find a generic function
>>(such as print):
>>
>>fun = Rf_findVar(...);
>>R_tryEval(fun, ...);

>
>
> I think without knowing what you are putting in '...' this is impossible
> to understand. R_tryEval() does not seem to be part of the public API and

Where can one find out what is a public R API and what isn't?

> I had to grep the sources to find it. However, it seems to be intended to
> evaluate an expression not a function, as in (tests/Embedding/tryEval.c)
>
> PROTECT(e = allocVector(LANGSXP, 2));
> SETCAR(e, Rf_install("sqrt"));
> SETCAR(CDR(e), NEW_CHARACTER(1));
> val = R_tryEval(e, NULL, &errorOccurred);
>
> and it is possible that 2.0.0 is detecting an incorrect usage that 1.9.1
> did not detect.
>

Silly me. I compressed my code a bit too much (hence the '...' you have noticed before). Actually, the expression gets constructed as above, with the only difference that it does not start with SETCAR(e, install("function_name")) but with SETCAR(e, obj) where obj = findVar(install("function_name"), R_GlobalEnv). This worked in previous versions (1.6.2 - 1.9.1) just fine. In 2.0.0 the problem, as described before, is that findVar returns a function object, but (in case of generic functions) the evaluation fails with the "Error in function (object, ...) : Invalid generic function in usemethod" error message.

I resorted to findFun function, however Peter Dalgaard here on the list suggested using findVar1 (which seems to be an even more obscure function than R_tryEval). I even had to write the header file by myself, although the function works just perfectly.

> Incidentally, your code need not be littered with Rf_*; that indicates
> you are not including the right header files.

Well, both Rf_findVar function and findVar macro are declared and defined, respectively, in the same (Rinternals.h) file. So I'm pretty sure I'm including the right header file :-).

It seems to me more and more that my problems don't have much to do with findVar ... functions, but are probably a result of deeper changes, maybe in generic function handling.

Matjaz.

-- 
dr. Matjaz Kukar
Univerza v Ljubljani
Fakulteta za racunalnistvo in informatiko
Trzaska 25, 1001 Ljubljana

______________________________________________
R-devel@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Sat Oct 09 06:57:39 2004

This archive was generated by hypermail 2.1.8 : Wed 03 Nov 2004 - 22:45:20 EST