首页 > 解决方案 > 如何将 Rcpp 列表返回给 C 函数

问题描述

问题

在 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程序就会崩溃。

标签: rrcpp

解决方案


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

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

推荐阅读