A bit of warning from a different angle.

Do you really want to be able to pass any arbitrary R function to your dendrapply ? You just can't expect R functions to work "in place".

e.g. your function fu:

fu <- function(node) {
   attr(node, "height") = attr(node, "height")+1
}

Does not modify its argument. It creates a copy, modifies the copy, and then returns (invisibly) the result of the expression, and then the copy is forgotten about, it just becomes a candidate for the next garbage collection.


As for the design of what you are doing, I would suggest:
- having one C++ function that would start by creating a clone of your list, using clone<List>.
- from this call a C++ function to recurse.
- for the actual function that does the modifying in place, I would suggest this is a C++ function. But this enters into the world of passing around C++ function pointers. Not sure you want to travel there yet.

Another thing could be not passing a function to execute, but some string identifying what it does, and then internally you can dispatch to the function.

Not sure this makes a lot of sense. Anyway, I think my question is:
do you really want the flexibility of being able to call any R function, or can you come up with a list of operations you'd do on terminal nodes of your tree ?

what do you want to do with your dendrograms ?

Romain

Le 26/07/13 17:06, Tal Galili a écrit :
Hello all,

I would like to write an Rcpp function that will get an R object, an R
function, and will use the function on the object through Rcpp.
For example:

library(Rcpp)
cppFunction('NumericVector runRfuncSum(NumericVector x, Function fu) {
             NumericVector fu_x = fu(x);
             return fu_x;
             }')
runRfuncSum(c(1:4), sum)

However, following the example given here:
http://gallery.rcpp.org/articles/rcpp-wrap-and-recurse/
I would like this function to get an R List (specifically a dendrogram),
and will recursively go through all of the dendrogram nodes and apply
the function.
I can't seem to get it to work.

For example:



cppFunction('
             List dendrapply_Cpp_fun(List x, Function FUN) {
             // note: The FUN will change the object x itself
             // hence - it must be clear to use an object we wish to
change (it will NOT be copied!)
             for( List::iterator it = x.begin(); it != x.end(); ++it ) {
             *it = FUN(*it);
             *it = dendrapply_Cpp_fun(*it, FUN);
             }
             return x;
             }')
fu <- function(node) {
    attr(node, "height") = attr(node, "height")+1
}
dend <- as.dendrogram(hclust(dist(USArrests[1:3,]), "ave"))
dendrapply_Cpp_fun(dend, fu)


Any suggestion as to why this is not working?

Thanks!


--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30

R Graph Gallery: http://gallery.r-enthusiasts.com

blog:            http://blog.r-enthusiasts.com
|- http://bit.ly/13SrjxO : highlight 0.4.2
`- http://bit.ly/10X94UM : Mobile version of the graph gallery

_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to