如何在RCPP中获取全局选项?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (41)

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

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

第一个函数不编译,第二个函数崩溃会话。

知道怎么做吗?

提问于
用户回答回答于

为什么代码不工作是因为对RCPP的AUTOMAGIC转换过多地依赖[R 。你需要创建一个中间步骤。回想一下R没有标量int数据类型的概念。

让我们看一下使用Rinternal宏返回的类型 Rf_type2char(TYPEOF(x))

比照

#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
用户回答回答于

test_option

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

SEXP test_option() {

或这个:

IntgerVector test_option() {

test_option2

将下面的代码放在当前目录中的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")
*/

所属标签

可能回答问题的人

  • 天使的炫翼

    17 粉丝531 提问36 回答
  • 富有想象力的人

    3 粉丝0 提问30 回答
  • 学生

    3 粉丝476 提问28 回答
  • o o

    4 粉丝494 提问27 回答

扫码关注云+社区

领取腾讯云代金券