From Peter.Peyk at unibas.ch  Fri Jul 18 07:06:34 2008
From: Peter.Peyk at unibas.ch (Peter Peyk)
Date: Fri, 18 Jul 2008 07:06:34 +0200
Subject: [Rd] Rcpp from C++
In-Reply-To: <11069970.472841216325644019.JavaMail.nabble@isper.nabble.com>
References: <11069970.472841216325644019.JavaMail.nabble@isper.nabble.com>
Message-ID: <200807180706.34902.Peter.Peyk@unibas.ch>

Hi Sri,

I haven't really elaborated on it having other stuff to prepare first, but as 
far as I got you first assign data to a vector:


#include <R.h>
#include <Rinternals.h>
#undef R_INTERFACE_PTRS
#include <Rembedded.h>
#include "Rcpp.hpp" 
#include <R_ext/Parse.h>
#include <Rinternals.h>
#include <Rdefines.h>

    //assigning a vector
    SEXP ab;
    PROTECT(ab = allocVector(REALSXP, 2));
    REAL(ab)[0] = 123.45;
    REAL(ab)[1] = 67.89;
    UNPROTECT(1);

the attach a R variable name to the data using

void defineVar(SEXP symbol, SEXP value, SEXP rho)
void setVar(SEXP symbol, SEXP value, SEXP rho)

but I haven't tried that yet in detail.

getVar is the other way around and finds the data to an R variable name:

SEXP getVar(SEXP name, SEXP rho)
{
    SEXP ans;     
    if(!isString(name) || length(name) != 1)
        error("name is not a single string");
    if(!isEnvironment(rho))
        error("rho should be an environment");
    ans = findVar(install(CHAR(STRING_ELT(name, 0))), rho);
    return ans;
}   



To get the data of an R-variable you should be able to use the constructors 
from Rcpp that take an SEXP as argument, but i also haven't tried that yet.

What I found to be useful too is the routine for evaluating R-commands:

    //evaluating commands
    int errorOccurred;
    ParseStatus status;
    SEXP cmdSexp, cmdexpr, ans = R_NilValue;
    PROTECT(cmdSexp = Rf_allocVector(LANGSXP, 1));
    char* cArr[4];
    cArr[0] = "a <- seq(1,20)";  
    cArr[1] = "b <- seq(1,20)";
    cArr[2] = "c <- a+ b";
    cArr[3] = "print(c)";
    for (int CommandInd = 0; CommandInd<4; CommandInd++)
    {
        PROTECT(cmdSexp = allocVector(STRSXP, 1));
        SET_STRING_ELT(cmdSexp, 0, mkChar(cArr[CommandInd]));
        cmdexpr = PROTECT(R_ParseVector(cmdSexp, -1, &status, R_NilValue));
        if (status != PARSE_OK) {
            UNPROTECT(2);
            error("invalid call!");
        }
        for(int i = 0; i < length(cmdexpr); i++)
        {
            ans = eval(VECTOR_ELT(cmdexpr, i), R_GlobalEnv);
            Rf_PrintValue(ans);
        }
    }

hope that helps
best
peter

P.S.: let me know if that works and what you find out!



[Rd] Rcpp from C++
Peter Peyk