将 Rcpp::String 从 table 转换为模式函数的 int

Convert Rcpp::String from table to int for a mode function

我想从 IntegerVector 中获取最频繁的值(例如模式)。我只能使用 Rcpp 糖函数。

如何将输出从 String 转换为 int

我的代码:

// [[Rcpp::export]]
String pier(NumericVector x) {
  IntegerVector wyniki;
  int max;  
  wyniki = Rcpp::table(x);
  max = which_max(wyniki);
  CharacterVector wynik_nazwy = wyniki.attr("names");
  String wynik = wynik_nazwy[max];
  return wynik;  
}

/***R
pier(c(3,2,2,2,2,4,4,5))
*/

维尼克:

> pier(c(3,2,2,2,2,4,4,5))
[1] "2"

它是正确的,但我需要的是数值 2 而不是我目前收到的字符串值 "2"。此外,在将函数导出到 R 后,我需要在 Rcpp 和 not 中转换它,

如果您使用的是 C++98,由于 // [[Rcpp::plugins(cpp11)]] 未定义,因此看起来是这种情况,然后使用 atoi() 函数和字符串的函数将字符串转换为整数.c_str() 函数。

例如

std::string ex = "1";
int res = atoi(ex.c_str());

为了简化问题,在这种情况下,.c_str() 的使用不需要像@nrussell 所指出的那样明确。这使我们无需创建中介 std::string,只需简单地使用访问 CharacterVector.

返回的内容即可

因此,说到这里,我们得出以下结论:

// [[Rcpp::export]]
int pier(NumericVector x) {
    IntegerVector wyniki;
    int max;  
    wyniki = Rcpp::table(x);
    max = which_max(wyniki);
    CharacterVector wynik_nazwy = wyniki.attr("names");
    return atoi( wynik_nazwy[max] );  
}

测试:

pier(c(3,2,2,2,2,4,4,5))
# [1] 2
class(pier(c(3,2,2,2,2,4,4,5)))
# [1] "integer"