从列表Rcpp中检索对象

从列表Rcpp中检索对象,r,list,rcpp,R,List,Rcpp,我是Rcpp的新手,我正在与之斗争。我有一个函数,它返回一个包含两个对象的列表:向量中的max和argmax。我想在另一个函数中仅从该列表中检索max或argmax。我该怎么做? 下面是一个例子: #include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] List max_argmax_cpp(NumericVector x){ double max = x[0]; int argmax = 0 + 1; f

我是Rcpp的新手,我正在与之斗争。我有一个函数,它返回一个包含两个对象的列表:向量中的max和argmax。我想在另一个函数中仅从该列表中检索max或argmax。我该怎么做? 下面是一个例子:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
List max_argmax_cpp(NumericVector x){
  double max = x[0];
  int argmax = 0 + 1;
  for(int i = 1; i < x.length(); i++){
    if(x[i]>x[i-1]){
      max = x[i];
      argmax = i+1;
    }
  }
  List Output;
  Output["Max"] = max;  
  Output["Argmax"] = argmax;
  return(Output);
}

// [[Rcpp::export]]
int max_only(NumericVector x){
  int max = **only max from max_argmax_cpp(x)**;
  return(max);
}   
#包括
使用名称空间Rcpp;
//[[Rcpp::导出]]
列表max_argmax_cpp(数值向量x){
双倍最大值=x[0];
int argmax=0+1;
对于(int i=1;ix[i-1]){
max=x[i];
argmax=i+1;
}
}
列表输出;
输出[“最大”]=最大值;
输出[“Argmax”]=Argmax;
返回(输出);
}
//[[Rcpp::导出]]
仅限int max_(数值向量x){
int max=**仅最大值来自最大值argmax\u cpp(x)**;
返回(最大值);
}   

在第二个示例中,您只需调用原始函数并将其分配给一个
列表,该列表的元素可以通过名称(或位置)检索:

#包括
使用名称空间Rcpp;
//[[Rcpp::导出]]
列表max_argmax_cpp(数值向量x){
双倍最大值=x[0];
int argmax=0+1;
对于(int i=1;ix[i-1]){
max=x[i];
argmax=i+1;
}
}
列表输出;
输出[“最大”]=最大值;
输出[“Argmax”]=Argmax;
返回(输出);
}
//[[Rcpp::导出]]
仅限双最大值(数值向量x){
列表l=max_argmax_cpp(x);
双最大值=l[“最大值”];
返回(最大值);
} 
/***R
种子(42)
x组种子(42)
>x max_argmax_cpp(x)
$Max
[1] 0.7439746
$Argmax
[1] 99
>仅限最大值(x)
[1] 0.7439746

当使用RCPP属性时,C++函数名将被重写,因为目标是C++函数名称的R函数。因此,这里我建议将
max\u argmax\u cpp()
拆分为两个函数:一个用于工作,另一个可从R调用。然后,新函数
max\u only()
可以调用worker函数并只返回一个参数。这是一个示例,但实际情况是,我有一个MCMC,我生成了一个包含3个变量的列表,需要在另一个函数中使用。如果我分成3个独立的函数,我有两个问题:(1)它将花费3倍的时间,(2)我将从2个独立的MCMC链检索数据,这将导致错误的结果。有没有办法从另一个函数列表中选择“仅拾取对象”?(表中的每个对象都是一个矩阵)我想你误解了我写的内容。有一个函数可以完成这项工作。两个接口,即调用worker函数的两个访问器函数。如果你想进行微优化,而不是分配
argmax
,那么你可以用另一个选项发出信号。至于“更多的工作”与“不相同的流”,我想你可能有自己的设计问题。我觉得这不是Rcpp的问题。或者我只是误解了你的意思……你能给我一个关于“两个接口”的例子吗?我的问题是如何同时从一个函数返回多个对象。我用列表变量来做这个工作,但是我不知道如何在另一个函数中访问它。我把自己弄糊涂了——在C++中,C++函数当然是在同一个编译单元中看到的——从一个更复杂的调用R的例子中,它不通过<代码>内联< /C> >。谢谢你澄清这一点。
> set.seed(42)

> x <- runif(100)

> max_argmax_cpp(x)
$Max
[1] 0.7439746

$Argmax
[1] 99


> max_only(x)
[1] 0.7439746