Как установить значение по умолчанию для Rcpp::Function в аргументе функции в Rcpp?

#c #r #rcpp

#rcpp

Вопрос:

Я хочу установить значение по умолчанию в аргументе функции на Rcpp::Аргумент функции.

Просто простое назначение, Rcpp::Function func = mean , невозможно. Он возвращает ошибку: no viable conversion from '<overloaded function type>' to 'Rcpp::Function' (aka 'Function_Impl<PreserveStorage>')

Или я попробовал что-то вроде этого: Rcpp::Function func = Function("mean") , но опять же, это не работает. Он возвращает предупреждающее сообщение: Unable to parse C default value 'Function("mean")' for argument func of function .

Например, у меня есть своя собственная функция для максимального вызова maxC :

 // [[Rcpp::export]]
double maxC(NumericVector x) {
  double max;
  max = *std::max_element(x.begin(), x.end());

  return max;
}
 

Теперь я хочу использовать it ( maxC ) в качестве аргумента по умолчанию для другой функции, например, как это:

 // [[Rcpp::export]]
double aggregate(NumericVector x, Rcpp::Function func = maxC) {
  double agg;
  agg = Rcpp::as<double>(func(x));

  return agg;   
}
 

Но это не работает. Есть какие-нибудь предложения? Спасибо.

Комментарии:

1. Пожалуйста, присмотритесь повнимательнее к различным публичным примерам Rcpp::Function , например, в галерее Rcpp.

2. Привет, Дирк, я очень много гуглил, но ничего не нашел. Хороший ли ответ @coatless, пожалуйста?

Ответ №1:

Я не верю, что вы можете установить функцию по умолчанию таким образом… Лучшее, чего можно достичь, — это присвоить функции NULL значение, а затем заставить код выполнить соответствующее значение по умолчанию позже. Например…

 #include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::NumericVector func_defaults(Rcpp::NumericVector x,
                                  Rcpp::Nullable<Rcpp::Function> f = R_NilValue) {

  if (f.isNotNull()) {
    Rcpp::NumericVector res = Rcpp::as<Rcpp::Function>(f)(x);
    return res;
  }

  Rcpp::Environment global_funcs = Rcpp::Environment::global_env();
  Rcpp::Function mean_r = global_funcs["mean"];
  return mean_r(x);
}
 

тестирование:

 func_defaults(c(2.5,3,1))
# [1] 2.166667
func_defaults(c(2.5,3,1), mean)
# [1] 2.166667
func_defaults(c(2.5,3,1), median)
# [1] 2.5