Skip to content

[Rcpp-devel] Rcpp sugar preserving attributes

5 messages · Dirk Eddelbuettel, Søren Højsgaard

#
Dear all,

I have noticed an issue with preserving attributes (or rather attributes that are not preserved). Consider this code where I take the log of an array:

#include <Rcpp.h>
using namespace Rcpp;

//[[Rcpp::export]]
NumericVector fun1(NumericVector x){
  return log( x );
}

//[[Rcpp::export]]
NumericVector fun2(NumericVector x){
  NumericVector out=clone(x), tmp=log(x);
  for (int i=0;i<x.size();++i)out[i] = tmp[i];
  return out;
}

/*** R
x <- HairEyeColor; x
fun1(x)
fun2(x)
 */
[1] 3.4657359 3.9702919 2.3025851 1.0986123 2.3978953 3.9120230 2.3025851 3.4011974 2.3025851 3.2188758 1.9459101
[12] 1.6094379 1.0986123 2.7080502 1.9459101 2.0794415 3.5835189 4.1896547 2.7725887 1.3862944 2.1972246 3.5263605
[23] 1.9459101 4.1588831 1.6094379 3.3672958 1.9459101 1.6094379 0.6931472 2.6390573 1.9459101 2.0794415
, , Sex = Male

       Eye
Hair        Brown      Blue     Hazel     Green
  Black 3.4657359 2.3978953 2.3025851 1.0986123
  Brown 3.9702919 3.9120230 3.2188758 2.7080502
  Red   2.3025851 2.3025851 1.9459101 1.9459101
  Blond 1.0986123 3.4011974 1.6094379 2.0794415

, , Sex = Female

       Eye
Hair        Brown      Blue     Hazel     Green
  Black 3.5835189 2.1972246 1.6094379 0.6931472
  Brown 4.1896547 3.5263605 3.3672958 2.6390573
  Red   2.7725887 1.9459101 1.9459101 1.9459101
  Blond 1.3862944 4.1588831 1.6094379 2.0794415

fun2 is kludgy! Is there a more elegant way of preserving attributes using Rcpp sugar? 

All the best
S?ren
#
S?ren,

Happy New Year!
On 4 January 2015 at 09:53, S?ren H?jsgaard wrote:
| Dear all,
| 
| I have noticed an issue with preserving attributes (or rather attributes that are not preserved). Consider this code where I take the log of an array:

Quite possible. 

Attributes are just attached to objects, and we may well drop them along the
way.  Which is a bug.  Maybe you can start rewriting this in a way that
preserves attributes?  log is one of many 'math' functions implemented via
macro expansion so if you get it right for you get it right for many...

Dirk

| 
| #include <Rcpp.h>
| using namespace Rcpp;
| 
| //[[Rcpp::export]]
| NumericVector fun1(NumericVector x){
|   return log( x );
| }
| 
| //[[Rcpp::export]]
| NumericVector fun2(NumericVector x){
|   NumericVector out=clone(x), tmp=log(x);
|   for (int i=0;i<x.size();++i)out[i] = tmp[i];
|   return out;
| }
| 
| /*** R
| x <- HairEyeColor; x
| fun1(x)
| fun2(x)
|  */
| 
| 
| > fun1(x)
|  [1] 3.4657359 3.9702919 2.3025851 1.0986123 2.3978953 3.9120230 2.3025851 3.4011974 2.3025851 3.2188758 1.9459101
| [12] 1.6094379 1.0986123 2.7080502 1.9459101 2.0794415 3.5835189 4.1896547 2.7725887 1.3862944 2.1972246 3.5263605
| [23] 1.9459101 4.1588831 1.6094379 3.3672958 1.9459101 1.6094379 0.6931472 2.6390573 1.9459101 2.0794415
| 
| > fun2(x)
| , , Sex = Male
| 
|        Eye
| Hair        Brown      Blue     Hazel     Green
|   Black 3.4657359 2.3978953 2.3025851 1.0986123
|   Brown 3.9702919 3.9120230 3.2188758 2.7080502
|   Red   2.3025851 2.3025851 1.9459101 1.9459101
|   Blond 1.0986123 3.4011974 1.6094379 2.0794415
| 
| , , Sex = Female
| 
|        Eye
| Hair        Brown      Blue     Hazel     Green
|   Black 3.5835189 2.1972246 1.6094379 0.6931472
|   Brown 4.1896547 3.5263605 3.3672958 2.6390573
|   Red   2.7725887 1.9459101 1.9459101 1.9459101
|   Blond 1.3862944 4.1588831 1.6094379 2.0794415
| 
| fun2 is kludgy! Is there a more elegant way of preserving attributes using Rcpp sugar? 
| 
| All the best
| S?ren
| 
| 
| 
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
#
Thanks! Probably a stupid question, but where are these functions defined? In math.h I see

VECTORIZED_MATH_1(log,::log)

but - where to look for the implementation?

Cheers
S?ren


|-----Original Message-----
|From: Dirk Eddelbuettel [mailto:edd at debian.org]
|Sent: 4. januar 2015 16:32
|To: S?ren H?jsgaard
|Cc: rcpp-devel at lists.r-forge.r-project.org
|Subject: Re: [Rcpp-devel] Rcpp sugar preserving attributes
|
|
|S?ren,
|
|Happy New Year!
|
|On 4 January 2015 at 09:53, S?ren H?jsgaard wrote:
|| Dear all,
||
|| I have noticed an issue with preserving attributes (or rather
|attributes that are not preserved). Consider this code where I take the
|log of an array:
|
|Quite possible.
|
|Attributes are just attached to objects, and we may well drop them along
|the way.  Which is a bug.  Maybe you can start rewriting this in a way
|that preserves attributes?  log is one of many 'math' functions
|implemented via macro expansion so if you get it right for you get it
|right for many...
|
|Dirk
|
||
|| #include <Rcpp.h>
|| using namespace Rcpp;
||
|| //[[Rcpp::export]]
|| NumericVector fun1(NumericVector x){
||   return log( x );
|| }
||
|| //[[Rcpp::export]]
|| NumericVector fun2(NumericVector x){
||   NumericVector out=clone(x), tmp=log(x);
||   for (int i=0;i<x.size();++i)out[i] = tmp[i];
||   return out;
|| }
||
|| /*** R
|| x <- HairEyeColor; x
|| fun1(x)
|| fun2(x)
||  */
||
||
|| > fun1(x)
||  [1] 3.4657359 3.9702919 2.3025851 1.0986123 2.3978953 3.9120230
|| 2.3025851 3.4011974 2.3025851 3.2188758 1.9459101 [12] 1.6094379
|| 1.0986123 2.7080502 1.9459101 2.0794415 3.5835189 4.1896547 2.7725887
|| 1.3862944 2.1972246 3.5263605 [23] 1.9459101 4.1588831 1.6094379
|| 3.3672958 1.9459101 1.6094379 0.6931472 2.6390573 1.9459101 2.0794415
||
|| > fun2(x)
|| , , Sex = Male
||
||        Eye
|| Hair        Brown      Blue     Hazel     Green
||   Black 3.4657359 2.3978953 2.3025851 1.0986123
||   Brown 3.9702919 3.9120230 3.2188758 2.7080502
||   Red   2.3025851 2.3025851 1.9459101 1.9459101
||   Blond 1.0986123 3.4011974 1.6094379 2.0794415
||
|| , , Sex = Female
||
||        Eye
|| Hair        Brown      Blue     Hazel     Green
||   Black 3.5835189 2.1972246 1.6094379 0.6931472
||   Brown 4.1896547 3.5263605 3.3672958 2.6390573
||   Red   2.7725887 1.9459101 1.9459101 1.9459101
||   Blond 1.3862944 4.1588831 1.6094379 2.0794415
||
|| fun2 is kludgy! Is there a more elegant way of preserving attributes
|using Rcpp sugar?
||
|| All the best
|| S?ren
||
||
||
|| _______________________________________________
|| Rcpp-devel mailing list
|| Rcpp-devel at lists.r-forge.r-project.org
|| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-deve
|| l
|
|--
|http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
#
On 4 January 2015 at 19:58, S?ren H?jsgaard wrote:
| Thanks! Probably a stupid question, but where are these functions defined? In math.h I see
| 
| VECTORIZED_MATH_1(log,::log)
| 
| but - where to look for the implementation?

You mean where VECTORIZED_MATH is defined?  

Let me introduce you to my friend 'ag' (with a top of the hat to Kevin ...)

edd at max:~/git/rcpp/inst/include/Rcpp/sugar(master)$ ag VECTORIZED_MATH 
block/Vectorized_Math.h
83:#define VECTORIZED_MATH_1(__NAME__,__SYMBOL__)                               \

functions/math.h
25:VECTORIZED_MATH_1(exp,::exp)
26:VECTORIZED_MATH_1(acos,::acos)
27:VECTORIZED_MATH_1(asin,::asin)
28:VECTORIZED_MATH_1(atan,::atan)
29:VECTORIZED_MATH_1(ceil,::ceil)
30:VECTORIZED_MATH_1(ceiling,::ceil)
31:VECTORIZED_MATH_1(cos,::cos)
32:VECTORIZED_MATH_1(cosh,::cosh)
33:VECTORIZED_MATH_1(floor,::floor)
34:VECTORIZED_MATH_1(log,::log)
35:VECTORIZED_MATH_1(log10,::log10)
36:VECTORIZED_MATH_1(sqrt,::sqrt)
37:VECTORIZED_MATH_1(sin,::sin)
38:VECTORIZED_MATH_1(sinh,::sinh)
39:VECTORIZED_MATH_1(tan,::tan)
40:VECTORIZED_MATH_1(tanh,::tanh)
42:VECTORIZED_MATH_1(abs,::fabs)
44:VECTORIZED_MATH_1(gamma      , ::Rf_gammafn     )
45:VECTORIZED_MATH_1(lgamma     , ::Rf_lgammafn    )
46:VECTORIZED_MATH_1(digamma    , ::Rf_digamma     )
47:VECTORIZED_MATH_1(trigamma   , ::Rf_trigamma    )
48:VECTORIZED_MATH_1(tetragamma , ::Rf_tetragamma  )
49:VECTORIZED_MATH_1(pentagamma , ::Rf_pentagamma  )
50:VECTORIZED_MATH_1(expm1      , ::expm1          )
51:VECTORIZED_MATH_1(log1p      , ::log1p          )
59:VECTORIZED_MATH_1(factorial  , ::Rcpp::internal::factorial   )
60:VECTORIZED_MATH_1(lfactorial , ::Rcpp::internal::lfactorial  )
68:VECTORIZED_MATH_1(trunc, ::Rf_ftrunc)                // truncates to zero (cf Writing R Extension, 6.7.3 Numerical Utilities)
edd at max:~/git/rcpp/inst/include/Rcpp/sugar(master)$ 

[ ag is "just" a version of 'grep -r' on steroids, which knows to skip .git,
.svn etc pp -- recommended. In Debian/Ubuntu in package silversearcher-ag as
there already was a package called ag. ]

Dirk
#
Hi Dirk,

Cunning piece of code you pointed me to ('ag' seems like a good friend):

#define VECTORIZED_MATH_1(__NAME__,__SYMBOL__)                               \
namespace Rcpp{                                                              \
        template <bool NA, typename T>                                           \
        inline sugar::Vectorized<__SYMBOL__,NA,T>                                \
        __NAME__( const VectorBase<REALSXP,NA,T>& t ){                           \
                return sugar::Vectorized<__SYMBOL__,NA,T>( t ) ;                     \
        }                                                                        \
        inline sugar::Vectorized<__SYMBOL__,true,NumericVector>                  \
        __NAME__( SEXP x){ return __NAME__( NumericVector( x ) ) ; }             \
        template <bool NA, typename T>                                           \
        inline sugar::Vectorized_INTSXP<__SYMBOL__,NA,T>                         \
        __NAME__( const VectorBase<INTSXP,NA,T>& t      ){                           \
                return sugar::Vectorized_INTSXP<__SYMBOL__,NA,T>( t ) ;              \
        }                                                                        \
}

Thanks!
S?ren

|-----Original Message-----
|From: Dirk Eddelbuettel [mailto:edd at debian.org]
|Sent: 4. januar 2015 21:51
|To: S?ren H?jsgaard
|Cc: Dirk Eddelbuettel; rcpp-devel at lists.r-forge.r-project.org
|Subject: RE: [Rcpp-devel] Rcpp sugar preserving attributes
|
|
|On 4 January 2015 at 19:58, S?ren H?jsgaard wrote:
|| Thanks! Probably a stupid question, but where are these functions
|| defined? In math.h I see
||
|| VECTORIZED_MATH_1(log,::log)
||
|| but - where to look for the implementation?
|
|You mean where VECTORIZED_MATH is defined?
|
|Let me introduce you to my friend 'ag' (with a top of the hat to Kevin
|...)
|
|edd at max:~/git/rcpp/inst/include/Rcpp/sugar(master)$ ag VECTORIZED_MATH
|block/Vectorized_Math.h
|83:#define VECTORIZED_MATH_1(__NAME__,__SYMBOL__)
|\
|
|functions/math.h
|25:VECTORIZED_MATH_1(exp,::exp)
|26:VECTORIZED_MATH_1(acos,::acos)
|27:VECTORIZED_MATH_1(asin,::asin)
|28:VECTORIZED_MATH_1(atan,::atan)
|29:VECTORIZED_MATH_1(ceil,::ceil)
|30:VECTORIZED_MATH_1(ceiling,::ceil)
|31:VECTORIZED_MATH_1(cos,::cos)
|32:VECTORIZED_MATH_1(cosh,::cosh)
|33:VECTORIZED_MATH_1(floor,::floor)
|34:VECTORIZED_MATH_1(log,::log)
|35:VECTORIZED_MATH_1(log10,::log10)
|36:VECTORIZED_MATH_1(sqrt,::sqrt)
|37:VECTORIZED_MATH_1(sin,::sin)
|38:VECTORIZED_MATH_1(sinh,::sinh)
|39:VECTORIZED_MATH_1(tan,::tan)
|40:VECTORIZED_MATH_1(tanh,::tanh)
|42:VECTORIZED_MATH_1(abs,::fabs)
|44:VECTORIZED_MATH_1(gamma      , ::Rf_gammafn     )
|45:VECTORIZED_MATH_1(lgamma     , ::Rf_lgammafn    )
|46:VECTORIZED_MATH_1(digamma    , ::Rf_digamma     )
|47:VECTORIZED_MATH_1(trigamma   , ::Rf_trigamma    )
|48:VECTORIZED_MATH_1(tetragamma , ::Rf_tetragamma  )
|49:VECTORIZED_MATH_1(pentagamma , ::Rf_pentagamma  )
|50:VECTORIZED_MATH_1(expm1      , ::expm1          )
|51:VECTORIZED_MATH_1(log1p      , ::log1p          )
|59:VECTORIZED_MATH_1(factorial  , ::Rcpp::internal::factorial   )
|60:VECTORIZED_MATH_1(lfactorial , ::Rcpp::internal::lfactorial  )
|68:VECTORIZED_MATH_1(trunc, ::Rf_ftrunc)                // truncates to
|zero (cf Writing R Extension, 6.7.3 Numerical Utilities)
|edd at max:~/git/rcpp/inst/include/Rcpp/sugar(master)$
|
|[ ag is "just" a version of 'grep -r' on steroids, which knows to skip
|.git, .svn etc pp -- recommended. In Debian/Ubuntu in package
|silversearcher-ag as there already was a package called ag. ]
|
|Dirk
|
|--
|http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org