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)
*/
, , 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
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