#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