Установка значения по умолчанию NULL для параметра в функции R cpp - PullRequest
3 голосов
/ 09 мая 2020

Я хочу установить для параметра значение по умолчанию NULL в функции Rcpp и выполнить некоторые вычисления на основе параметра, если параметр не NULL. Примером такого кода может быть

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int test_null(Nullable<DataFrame> p1 = R_NilValue){

  if(p1.isNull()){
    NumericMatrix T(2,2);
    Rcout << T << std::endl;
  }
    else{
    NumericMatrix T(p1.nrow());
    Rcout << T << std::endl;
  }
  return (42);
}

Однако я не могу скомпилировать эту функцию и получаю сообщение об ошибке

error: no member named 'nrow' in 'Rcpp::Nullable<Rcpp::DataFrame_Impl<PreserveStorage> >'

, которое сообщает мне, что нет nrow, определенного для Nullable DataFrame. Есть ли другой способ реализовать значение по умолчанию NULL для параметра (т.е. DataFrame) в Rcpp, чтобы я мог вычислить другие свойства (количество или строки, столбцы и c.) Из DataFrame, если это не NULL.

Любая помощь будет принята с благодарностью!

Спасибо!

SN248

1 Ответ

5 голосов
/ 09 мая 2020

Вы были очень близки. Вы пропустили один экземпляр: Nullable<> еще не совпадает с его типом шаблона --- нам нужно сначала создать объект.

Итак, вот ваш код с исправленными пробелами ;-) и отсутствующей строкой плюс тестовый вызов каждого случая:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int test_null(Nullable<DataFrame> p1 = R_NilValue){

  if (p1.isNull()) {
    NumericMatrix T(2,2);
    Rcout << T << std::endl;
  } else {
    DataFrame S(p1);
    NumericMatrix T(S.nrow());
    Rcout << T << std::endl;
  }
  return (42);
}

/*** R
test_null(NULL)
test_null(data.frame(a=1:3, b=letters[1:3]))
*/

, для которого я получаю ожидаемый результат:

R> Rcpp::sourceCpp("~/git/stackoverflow/61701367/answer.cpp")

R> test_null(NULL)
0.00000 0.00000
0.00000 0.00000

[1] 42

R> test_null(data.frame(a=1:3, b=letters[1:3]))
0.00000 0.00000 0.00000
0.00000 0.00000 0.00000
0.00000 0.00000 0.00000

[1] 42
R> 
...