如何将Rcpp列表返回到C函数

时间:2018-07-05 05:09:53

标签: r rcpp

问题

在R包中,如何将Rcpp::List返回到C函数?

示例

我在github page上托管了一个软件包来说明要求。

它包含一个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 :(得分:2)

感谢所有指针,我使程序能够按预期工作。现在的完整结构是

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;
}