[Rcpp-devel] Extract a function from a list and create a call
Romain Francois
romain.francois at dbmail.com
Fri Mar 19 21:20:40 CET 2010
Hello,
The following works for me :
require( Rcpp )
require( inline )
fx <- cfunction( signature( data_ = "list" ),
'
List data(data_) ;
std::string family = data["family"] ;
std::string link = data["link"] ;
std::cout << "family : " << family << std::endl ;
std::cout << "link : " << link << std::endl ;
return R_NilValue ;
', Rcpp = TRUE, includes = "using namespace Rcpp;" )
> fx( )
family : poisson
link : log
NULL
But we have an issue with the proxy class we use in CharacterVector. It
seems if you have a CharacterVector :
CharacterVector family = data["family"] ;
you can grab one element as a C string (const char*)
const char* fam = family[0] ;
but not as a std::string for some reason. some investigation needed.
Romain
Le 19/03/10 20:21, Douglas Bates a écrit :
>
> I must be missing something horribly obvious but I have now spent
> several hours trying to find a way to extract a character string from
> a list. I am more-or-less certain that I am copying a construction in
> the unitTests/runit.CharacterVector.R but the compiler just keeps
> spitting out error messages at me.
>
> The background is that a glm "family" object in R is a named list (or
> should be, it has an S3 class but that doesn't mean anything about the
> structure). The standard ones look like
>
>> str(poisson())
> List of 12
> $ family : chr "poisson"
> $ link : chr "log"
> $ linkfun :function (mu)
> $ linkinv :function (eta)
> $ variance :function (mu)
> $ dev.resids:function (y, mu, wt)
> $ aic :function (y, n, mu, wt, dev)
> $ mu.eta :function (eta)
> $ initialize: expression({ if (any(y< 0))
> stop("negative values not allowed for the Poisson family") n<-
> rep.int(1, nobs) mustart<- y + 0.1 })
> $ validmu :function (mu)
> $ valideta :function (eta)
> $ simulate :function (object, nsim)
> - attr(*, "class")= chr "family"
>
> All I want to do is to take such a list and extract the "family" and
> "link" strings as std::string. If the name of the Rcpp::List object
> in the C++ code is lst, I can get as far as
>
> StringVector fam = lst["family"];
>
> but after that it all turns to custard. In the class I am defining
> the family member is declared as a std::string. In the constructor
> for the class from a List object I try
>
> family = Rcpp::as<std::string>(fam[0]);
>
> or even, mimicking a couple of the tests in unitTests/runit.CharacterVector.R,
>
> family += fam[0];
>
> but I have not been able to construct anything that my compiler will accept.
>
> So, how do I get the value of one of the elements of a CharacterVector
> (or StringVector, I think they are synonyms) as a std::string, short
> of using std::string(CHAR(STRING_ELT(fam, 0))
--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://tr.im/OIXN : raster images and RImageJ
|- http://tr.im/OcQe : Rcpp 0.7.7
`- http://tr.im/O1wO : highlight 0.1-5
More information about the Rcpp-devel
mailing list