2016-07-30 4 views
0

Я разрабатывает пакет R с помощью Rcpp, и теперь я пытаюсь включить следующую C++ функции без входных аргументов:функция Rcpp без аргумента

int printVariables() { 
    // Code 
    return 0; 
} 

у меня в RcppExports.cpp следующей функции:

int printVariables(); 
RcppExport SEXP printVariables() { 
BEGIN_RCPP 
    Rcpp::RObject __result; 
    Rcpp::RNGScope __rngScope; 
    __result = Rcpp::wrap(printVariables()); 
    return __result; 
END_RCPP 
} 

Наконец, в RcppExports.RI есть запись следующим образом:

printVariables <- function() { 
    .Call('printVariables', PACKAGE = 'my_package') 
} 

Whe n Скомпилировать код Я получаю эту ошибку:

RcppExports.cpp: In function ‘SEXPREC* printVariables()’: 
RcppExports.cpp:54:37: error: ambiguating new declaration of ‘SEXPREC* printVariables()’ 
RcppExport SEXP printVariables() { 
RcppExports.cpp:53:5: note: old declaration ‘int printVariables()’ 
int printVariables(); 

Кто-нибудь знает, как я могу решить эту проблему?

+0

Какой тип 'RcppExport'? –

ответ

3

Просто поместите здесь игнорируемый аргумент. Тип возврата void работает, но вы должны иметь хотя бы один аргумент, который вы можете игнорировать.

R> cppFunction("void foo(int ignored=0) { double d; }") 
R> foo() 
R> 

Просмотреть все замечательные детали Rcpp Attributes vignette.

Редактировать я стоять исправлен, благодаря @hrbrmstr, кто правильно указывает на то, что это делает конечно работы в пакете. То есть даже пример функции, созданный RStudio когда просят сделать File -> New Project -> New Directory -> R пакет, и когда 'Пакет ж/Rcpp', это выбрать есть это:

// [[Rcpp::export]] 
List rcpp_hello() { 
    CharacterVector x = CharacterVector::create("foo", "bar"); 
    NumericVector y = NumericVector::create(0.0, 1.0); 
    List z   = List::create(x, y); 
    return z; 
} 

, который, очевидно, без аргумент.

+0

rly? (я ненавижу спросить, что тоже, учитывая, кто этот ответ::) Я буквально просто добавил функцию OP к тестовому пакету rcpp, который у меня есть для этого, но использовал '// [[Rcpp :: export]]' помощник для генерации других битов, и он работал нормально с аргументом dummy. Не правда ли, что у них есть 'int printVariables();' в заголовочном файле, который сжимает тот, что находится в экспортной cpp? – hrbrmstr

+0

Возможно, он работает в пакете, и OP _just_ забыл добавить '// [[Rcpp :: exports]]' - это также рифмуется с тем, что я помню .... Для 'cppFunction()' use, нужен фиктивный аргумент. И вообще, это я) не пострадал, а ii) кто это делает? –

+0

Он работает с фиктивным аргументом. Точно так же, я полагаю, функции должны возвращать что-то, будучи невозможной функцией возврата пустоты, не так ли? –

Смежные вопросы