在R包中,如何将Rcpp::List
返回到C
函数?
我在github page上托管了一个软件包来说明要求。
它包含一个R
函数,该函数调用一个C
函数,我想调用C++
函数来检索列表。
#' @useDynLib crcpp c_ask_for_list
r_ask_for_list <- function() {
.Call(c_ask_for_list)
}
#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);
}
#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
行,程序将崩溃。
答案 0 :(得分:2)
感谢所有指针,我使程序能够按预期工作。现在的完整结构是
#' @useDynLib crcpp c_ask_for_list
#' @export
r_ask_for_list <- function() {
.Call("c_ask_for_list", packages = "crcpp")
}
文件: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);
}
文件: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;
}