我想获取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];
}
第一个函数无法编译,第二个函数使会话崩溃。
有什么想法吗?
答案 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)
如果您这样编写,您的第一个函数将起作用:
SEXP test_option() {
或者这个:
IntgerVector test_option() {
关于问题的第二个功能,您在注释中写道,您的目标是将SEXP转换为int
,因此在这种情况下,如果s
是SEXP
然后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")
*/