[R] Use of 'defineVar' and 'install' in .Call
Daniel Berg
daniel at danielberg.no
Wed Mar 28 11:19:04 CEST 2007
Now it works, I made no changes to the functions in question, must
have been some other mistake in my code and I obviously misinterpreted
the crash report.
defineVar(install(str),mkans(x),rho) works fine. The content of the
variable 'str' is assigned in the given environment in R as it should.
I apologize that I posted this before testing it properly.
Regards,
Daniel
On 3/27/07, Daniel Berg <daniel at danielberg.no> wrote:
> Dear all,
>
> [system and version information below]
>
> I am trying to modify a C function for finding the root of an
> expression. The function is to be called from R as .Call with input
> parameters:
>
> f: expression for which we will find the root
> guesses: interval for the solution
> stol: tolerance
> rho: environment
>
> The original functions I use are:
>
> SEXP mkans(double x) {
> SEXP ans;
> PROTECT(ans = allocVector(REALSXP, 1));
> REAL(ans)[0] = x;
> UNPROTECT(1);
> return ans;
> }
> double feval(double x, SEXP f, SEXP rho) {
> defineVar(install("x"), mkans(x), rho);
> return(REAL(eval(f, rho))[0]);
> }
> SEXP zero(SEXP f, SEXP guesses, SEXP stol, SEXP rho) {
> double x0 = REAL(guesses)[0], x1 = REAL(guesses)[1], tol = REAL(stol)[0];
> double f0, f1, fc, xc;
> if(tol <= 0.0) error("non-positive tol value");
> f0 = feval(x0, f, rho); f1 = feval(x1, f, rho);
> if(f0 == 0.0) return mkans(x0);
> if(f1 == 0.0) return mkans(x1);
> if(f0*f1 > 0.0) error("x[0] and x[1] have the same sign");
> for(;;) {
> xc = 0.5*(x0+x1);
> if(fabs(x0-x1) < tol) return mkans(xc);
> fc = feval(xc, f, rho);
> if(fc == 0) return mkans(xc);
> if(f0*fc > 0.0) {
> x0 = xc; f0 = fc;
> }
> else {
> x1 = xc; f1 = fc;
> }
> }
> }
>
>
> This works great. However, I wish to make it more general, by
> modifying 'feval'. Given that my problem involves a data set 'u', with
> dimension (i x j), I need to assign values to 'u1', 'u2', ..., 'ui'
> via defineVar(install(...)). I tried the following:
>
> double feval(double x, double *u, int d, double v, SEXP f, SEXP rho) {
> int i;
> char *str1="u", str2[1001], *str3;
> defineVar(install("x"), mkans(x), rho);
> defineVar(install("y"), mkans(v), rho);
> for(i=0;i<d;i++) {
> sprintf(str2,"%d",i+1);
> str3 = (char *)malloc((strlen(str1)+strlen(str2)+1)*sizeof(char));
> strcpy(str3,str1);
> strcat(str3,str2);
> defineVar(install(str3), mkans(u[i]), rho);
> }
> free(str3);
> return(REAL(eval(f,rho))[0]);
> }
>
> My R-package still compiles without errors but R crashes due to the
> defineVar command.
>
> Any suggestions to how I can do the defineVar bit?
>
> Thanks in advance.
>
> Reagards,
> Daniel Berg
>
> --------------------------------------------
> > R.Version()
> $platform
> [1] "i486-pc-linux-gnu"
> $arch
> [1] "i486"
> $os
> [1] "linux-gnu"
> $system
> [1] "i486, linux-gnu"
> $status
> [1] ""
> $major
> [1] "2"
> $minor
> [1] "3.1"
> $year
> [1] "2006"
> $month
> [1] "06"
> $day
> [1] "01"
> $`svn rev`
> [1] "38247"
> $language
> [1] "R"
> $version.string
> [1] "Version 2.3.1 (2006-06-01)"
> --------------------------------------------
>
--
danielberg.no
More information about the R-help
mailing list