Le 23 oct. 2011 à 05:52, Michael Hannon <jm_han...@yahoo.com> a écrit :

> Greetings.  I'm trying to pick off, in C++, one component, which is a matrix,
> from an R list.
> 
> In the first appended example, starting with:
> 
>     ** A list containing a matrix
> 
> I pass a list from R to C++ and pick it off with a simple assignment
> statement:
> 
>     ccode = '
>         Rcpp::List l(l_R);
>         Rcpp::IntegerMatrix m = l["m"];;
>         [...]
> 
> This seems to work just fine.
> 
> But in the second appended example, starting with:
> 
>     ** Putting it into a class
> 
> the seemingly equivalent statement in the body of a class constructor fails
> with a compilation error:
> 
>   includes = '
>   class CCC{
>   public:
>     CCC(Rcpp::List l){
>       m = l["m"];
>     }
>   [...]
>   private:
>     Rcpp::IntegerMatrix m;
>   }
>   '

Here you are trying to use the assignment operator, we could not manage to 
remove the ambiguity. 

In the first example, you use the ctor, and in this case we managed the 
disambiguation. 

i would advise using this as the ctor of CCC :

>  CCC(Rcpp::List l) : m( l["m"] ) {}

Romain

> Error in compileCode(f, code, language = language, verbose = verbose) : 
>   Compilation ERROR, function(s)/method(s) not created! file33334060.cpp: In
> constructor ‘CCC::CCC(Rcpp::List)’:
> file33334060.cpp:23:16: error: ambiguous overload for ‘operator=’ in
> ‘((CCC*)this)->CCC::m = Rcpp::Vector<RTYPE>::operator[](const string&) [with
> int RTYPE = 19, Rcpp::Vector<RTYPE>::NameProxy =
> Rcpp::internal::generic_name_proxy<19>, std::string =
> std::basic_string<char>]((* & std::basic_string<char>(((const char*)"m"),
> (*(const std::allocator<char>*)(& std::allocator<char>())))))’
> [...]
> 
> 
> My sessionInfo() output is at the very bottom of this message.
> 
> Any idea what I'm doing wrong?
> 
> Thanks,
> 
> -- Mike
> 
> 
> ** A list containing a matrix
> #+begin_src R
>   library(Rcpp)
>   library(inline)
>   
>   includes = '
>   '
>   ccode = '
>       Rcpp::List l(l_R);
>       Rcpp::IntegerMatrix m = l["m"];
>       return Rcpp::wrap(m(2,0));
>     '
>   fn = cxxfunction(
>     sig      = signature(l_R = "list"),
>     body     = ccode,
>     includes = includes,
>     plugin   = "Rcpp")
>   
>   m <- matrix(1:6, ncol = 2)
>   l <- list(m = m, a = 14)
>   fn(l)
>   
> #+end_src
> 
> #+results:
> : 3
> 
> ** Putting it into a class
> #+begin_src R
>   library(Rcpp)
>   library(inline)
>   
>   includes = '
>   class CCC{
>   public:
>     CCC(Rcpp::List l){
>       m = l["m"];
>     }
>     Rcpp::IntegerMatrix mGet(){
>       return m;
>     }
>   private:
>     Rcpp::IntegerMatrix m;
>   }
>   '
>   ccode = '
>       Rcpp::List l(l_R);
>       CCC ccc(l_R);
>       return Rcpp::wrap(ccc.mGet());
>     '
>   fn = cxxfunction(
>     sig      = signature(l_R = "list"),
>     body     = ccode,
>     includes = includes,
>     plugin   = "Rcpp")
>   
>   m <- matrix(1:6, ncol = 2)
>   l <- list(m = m, a = 14)
>   fn(l)
>   
> #+end_src
> 
> #+results:
> 
> 
> 
>> sessionInfo()
> R version 2.13.1 (2011-07-08)
> Platform: x86_64-redhat-linux-gnu (64-bit)
> 
> locale:
>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               
> LC_TIME=en_US.UTF-8       
>  [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=C
> LC_MESSAGES=en_US.UTF-8   
>  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C       
>        
> [10] LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 
> LC_IDENTIFICATION=C       
> 
> attached base packages:
> [1] stats     graphics  grDevices datasets  utils     methods   base  
> 
> _______________________________________________
> Rcpp-devel mailing list
> Rcpp-devel@lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to