2016-11-13 3 views
0

I ein R-Funktion bar haben, die eine andere R-Funktion foo, definiert wie folgt möglich:RCPP - Definieren einer C++ Funktion, die eine R-Funktion und ein Auslassungszeichen Argument nimmt

foo <- function(x,y) x + y 
bar <- function(foo, z, ...) z + foo(...) 

Ein Aufruf von bar würde der sein, Form:

bar(foo, 1,2,3) 

Jetzt mit foo wie oben definiert, ich möchte eine C++ Version von bar erstellen. Hier ist, was ich versucht habe:

library(Rcpp) 
cppFunction(
' 
    double bar(Function foo, double z, ...) { 
    return z + foo(...); 
} 
') 

Dies funktioniert eindeutig nicht. Was wäre der richtige Weg, um diese Funktion in C++ zu definieren?

Danke.

+3

Wenn Sie 'foo' und alle Argumente ('...') auf der R-Seite, warum nicht passieren nur das Ergebnis von 'foo (...)' in die RCPP Funktion? Das Auswerten von 'foo (..)' aus C++ ist * immer * langsamer als das Auswerten von 'foo (...)' direkt von der R-Seite. – nrussell

Antwort

6

Es könnte einfacher sein, Ihre Auslassungszeichen in eine Liste zu machen, bevor es zu RCPP

bar <- function(foo, z, ...) { 
    args <- list(...) 
    bar_internal(foo, z, args) 
} 

Und dann RCPP Funktion kann einfach nehmen eine Rcpp::List statt Ellipsen Fütterung.

double bar_internal(Function foo, double z, List args){ 

} 
+3

Ellipsis Verwendung zwischen C++ und R hat _many_ Probleme oder Herausforderungen im Rcpp-Kontext, da wir durch 'SEXP, Call (" SomeId ", SEXP, SEXP, ...) gebunden sind. Wir haben einige Versuche im Code (und dann hängt es davon ab, ob Sie C++ 98 oder C++ 11 oder später verwenden), aber ehrlich gesagt ist Ihre beste Wette das, was @ Jeroen vorschlägt. Einfach die Komplikation vermeiden und weitermachen. –

Verwandte Themen