From matjaz.kukar at fri.uni-lj.si  Fri Oct  8 22:53:07 2004
From: matjaz.kukar at fri.uni-lj.si (Matjaz Kukar)
Date: Fri Oct  8 22:53:18 2004
Subject: [Rd] R-2.0.0  findVar and findFun question
In-Reply-To: <Pine.LNX.4.44.0410081237020.1140-100000@gannet.stats>
References: <Pine.LNX.4.44.0410081237020.1140-100000@gannet.stats>
Message-ID: <4166FE33.2010105@fri.uni-lj.si>

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


[Rd] R-2.0.0 findVar and findFun question
Matjaz Kukar