2016-11-13 11 views
0

У меня есть функцию bar R, который принимает другую функцию R foo, определяется следующим образом:Rcpp - Определить функцию С ++, которая принимает функцию R и многоточие аргумент

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

Вызов bar бы из форма:

bar(foo, 1,2,3) 

Теперь с foo, как определено выше, я хочу, чтобы создать версию C++ из bar. Вот что я пробовал:

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

Это явно не работает. Каким будет правильный способ определить эту функцию в C++?

Спасибо.

+3

Если у вас есть 'Foo' и все аргументы (' ... '), доступных на стороне R, то почему бы не просто передать результат' Foo (...) 'в функцию Rcpp? Оценка 'foo (..)' из C++ всегда * будет медленнее, чем оценка 'foo (...)' непосредственно со стороны R. – nrussell

ответ

6

Это может быть проще, чтобы превратить ваше многоточие в список перед подачей его в Rcpp

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

И тогда ваша функция Rcpp может просто взять Rcpp::List вместо многоточия.

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

} 
+3

Использование эллипсиса между C++ и R имеет проблемы _many_ или проблемы в контексте Rcpp, поскольку мы связаны «SEXP, Call (« someId », SEXP, SEXP, ...)». У нас есть некоторые попытки в коде (а затем зависит от того, используете ли вы C++ 98 или C++ 11 или новее), но, откровенно говоря, ваш лучший выбор - это то, что предлагает @Jeroen. Просто избегайте осложнений и продолжайте движение. –