使C和C函数(或变量)可用于R和Rcpp函数

时间:2016-09-15 21:35:52

标签: c++ r rcpp

我想使用这个函数(或者只是它返回的String):

const char* ERROR_TYPE() {
  return "unknown type detected for big.matrix object!";
}

在我的R(cpp)包中。

我想让它可用于我所有的Rcpp函数(src /中的文件)和我的所有测试(test / testthat /中的R文件)。

换句话说,我想使用throw Rcpp::exception(MESSAGE);testthat::expect_error(foo(), MESSAGE),其中MESSAGE定义为一次

我试图阅读并测试Rcpp Attributes中的一些内容,但它似乎不适用于我的问题。

我尝试过的第一件事是定义

// [[Rcpp::export]]
const char* ERROR_TYPE() {
  return "unknown type detected for big.matrix object!";
}

但它不适用于其他Rcpp文件。 然后,我尝试在其他Rcpp文件中#include "myfile.cpp",但我有多个定义,即使在尝试使用inline#ifndef #define #endif时,我认为对于C ++文件来说这很奇怪。 最后,我尝试使用inst/include/mypackage.h并在那里定义我的函数或变量,但它似乎也不适用于其他C ++函数。

一个技巧似乎有用,定义一个R函数

ERROR_TYPE <- function() {
  "unknown type detected for big.matrix object!"
}

然后使用

Function err("ERROR_TYPE");
throw Rcpp::exception(as<const char*>(err()));

在你的Rcpp函数中。 虽然似乎不是很好的做法。 并且,它适用于devtools::test()但不适用devtools::check()或Travis-CI(无法找到该功能),因此它也不是解决方案。

1 个答案:

答案 0 :(得分:0)

  • 使用 List<String> myList = new ArrayList<String>(); myList.add("xyz"); testng.setTestClasses(classes); testng.setTestNames(myList); testng.run();

    inst/include/utils.h
  • 在所有需要它的Rcpp文件中包含此标题

  • 创建一个返回此错误消息的Rcpp函数:

    #ifndef UTILS_H
    #define UTILS_H   
    
    const char* const ERROR_TYPE = "unknown type detected for big.matrix object!";
    
    #endif // UTILS_H
    
  • 在R功能中使用#include <bigstatsr/utils.h> // [[Rcpp::export]] const char* const GET_ERROR_TYPE() { return ERROR_TYPE; }