将R列表中的数值直接分配给C ++中的NumericVector

问题描述 投票:0回答:1

我想将fisher.test函数返回的双精度(精确浮点)值放入R C ++中的2个向量中。

[如下所示分配给double时,对于p值和置信区间的下限,但对于置信区间的上限,则事物按预期工作:

// perform Fisher Exact test
IntegerVector v = { 1, 2, 3, 4 };
v.attr("dim") = Dimension(2, 2);
Function f("fisher.test");
List fe = f(v);
// now assign to variables
List sublist = fe["p.value"];
double pValue = sublist[0];
Rcout << "pValue:" << pValue;
sublist = fe["conf.int"];
NumericVector cis = sublist[0];
double ci_upperBound = cis[1];
Rcout << "ub:" << ci_upperBound ;

但是,如下所示分配给NumericVectors无效(分配了值,但没有正确的值,就像指针未对齐一样。)

NumericVector pValues(1);
NumericVector ciLowerBounds(1);
// (then perform Fisher test as per above)
// now assign to variables
List sublist = fe["p.value"];
pValues[0] = sublist[0];
Rcout << "pValue:" << pValues[0];
sublist = fe["conf.int"];
NumericVector cis = sublist[0];
ciUpperBounds[0] = cis[1];

我尝试使用pValues[0] = Rcpp::as<double>sublist[0];,但IDE告诉我这是从不兼容的类型进行分配。

您能帮我按适当的指标将置信区间的p.value和lupper边界直接分配给相应的NumericVectors吗?

rcpp
1个回答
0
投票

您的问题和示例对我来说还不是很清楚,但是我认为您的问题的一部分是List fe的元素已经是矢量(不是列表,就像您对sublist对象所假定的那样),因此您可以提取它们直接

library(Rcpp)

cppFunction(
  code = '
    SEXP test( IntegerVector v ) {
      v.attr("dim") = Dimension(2, 2);

      Function f("fisher.test");
      List fe = f(v);

      NumericVector p = fe["p.value"];
      NumericVector ci = fe["conf.int"];

      return List::create(
        _["p"] = p,
        _["ci"] = ci
      );
    }
  '
)

v <- 1:4
test(v)
# $p
# [1] 1
# 
# $ci
# [1]  0.008512238 20.296715040
# attr(,"conf.level")
# [1] 0.95
© www.soinside.com 2019 - 2024. All rights reserved.