在Rcpp中获取全局选项

时间:2018-07-08 21:23:17

标签: r rcpp

我想获取Rcpp中一个选项的值(例如"width")。我尝试过:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int test_option() {

  Environment base("package:base");
  Function get_option = base["getOption"];
  return get_option("width");
}

// [[Rcpp::export]]
int test_option2() {

  Environment base("package:base");
  Function get_option = base["options"];
  List l_width = get_option("width");
  return l_width[1];
}

第一个函数无法编译,第二个函数使会话崩溃。

有什么想法吗?

2 个答案:

答案 0 :(得分:8)

代码无法正常工作的原因是因为对Rcpp的自动魔术转换为 R 的依赖过多。您将需要创建一个中间步骤。 回想,其中 R 没有标量int数据类型的概念。

让我们看看使用Rinternal宏Rf_type2char(TYPEOF(x))

返回的类型

c.f。

#include<Rcpp.h>

// [[Rcpp::export]]
void test_option() {

  Rcpp::Environment base("package:base");
  Rcpp::Function get_option = base["getOption"];
  Rcpp::Rcout << Rf_type2char(TYPEOF(get_option("width")));
}

这给出了:

test_option()
# integer

从那里,添加返回类型:

#include<Rcpp.h>

// [[Rcpp::export]]
Rcpp::IntegerVector  get_width() {

  Rcpp::Environment base("package:base");
  Rcpp::Function get_option = base["getOption"];
  Rcpp::IntegerVector out = get_option("width");

  return out;
}

输出:

get_width()
# [1] 155

答案 1 :(得分:2)

test_option

如果您这样编写,您的第一个函数将起作用:

SEXP test_option() {

或者这个:

IntgerVector test_option() {

test_option2

关于问题的第二个功能,您在注释中写道,您的目标是将SEXP转换为int,因此在这种情况下,如果sSEXP然后as<int>(s)INTEGER(s)[0]的整数是int。这与IntegerVector相反。如果您确实想写一个IntegerVector,请用int替换下面三个IntegerVector的出现。

将下面的代码放在当前目录的myOption.cpp中,并按照第一行中的说明进行操作。

// To run: library(Rcpp); sourceCpp("myOption.cpp")

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int myOption(CharacterVector x) {
  Environment base( "package:base" ) ;
  Function getOption = base["getOption"];
  SEXP s = getOption(x);
  int i = as<int>(s);
  return i;
}

/*** R
myOption("width")
*/