Как вернуть список Rcpp в функцию C - PullRequest
0 голосов
/ 05 июля 2018

Вопрос

В пакете R как мне вернуть Rcpp::List в C функцию?

Пример

У меня есть пакет, размещенный на моей странице github , чтобы проиллюстрировать это требование.

Он содержит функцию R, которая вызывает функцию C, которую я хотел бы вызвать функцией C++ для получения списка.

R

#' @useDynLib crcpp c_ask_for_list
r_ask_for_list <- function() {
    .Call(c_ask_for_list)
}

C

#include <Rinternals.h>

SEXP c_ask_for_list (){
    SEXP l = PROTECT(allocVector(VECSXP, 1));
    //l = rcpp_create_list();          // Call the C++ function to create the list
    UNPROTECT(1);
    return(l);
}

C ++

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
extern "C" SEXP rcpp_create_list() {
    Rcpp::List l(1);
    l[0] = "foo";
    return l;
}

Если я раскомментирую строку l = rcpp_create_list() в функции C, программа вылетает.

1 Ответ

0 голосов
/ 06 июля 2018

Благодаря всем указателям у меня есть программа, работающая как задумано. Полная структура теперь

R

#' @useDynLib crcpp c_ask_for_list
#' @export
r_ask_for_list <- function() {
    .Call("c_ask_for_list", packages = "crcpp")
}

C

файл: c_ask_for_list.h

#ifndef CRCPP_H
#define CRCPP_H

#include <Rinternals.h>

#ifdef __cplusplus
extern "C" {
#endif

SEXP rcpp_create_list();

#ifdef __cplusplus
}
#endif

#endif /* CRCPP_H */

файл: c_ask_for_list.c

#include "c_ask_for_list.h"

SEXP c_ask_for_list () {
    SEXP l = _crcpp_rcpp_create_list();          // Call the C++ function to create the list
    return(l);
}

C ++

файл: rcpp_create_list.cpp

#include <Rcpp.h>
using namespace Rcpp;

//' @importFrom Rcpp evalCpp
//' @export
// [[Rcpp::export]]
SEXP rcpp_create_list() {
    Rcpp::List l(2);
    l[0] = "foo";
    l[1] = "bar";
    return l;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...