在Rcpp中将“Infinity”的字符串版本转换为Numeric

时间:2016-02-23 02:31:36

标签: r rcpp

我有一些JSON响应将Inf / -Inf / NaN编码为字符串,因此它返回的JSON数组看起来像[1.0, "Infinity", 2.0]。我使用JSON库解析它,最后得到一个看起来像list(1.0, "Infinity", 2.0)的列表,我想将它转换为list(1.0, Inf, 2.0),出于性能原因,我需要使用Rcpp。这是我尝试过的代码,但我似乎无法让Rcpp对我大喊大叫

library(Rcpp)

cppFunction('
NumericVector convertThings(List data) {
  const size_t num_rows = data.size();
  NumericVector rv(num_rows);
  for (size_t i = 0; i < num_rows; ++i) {
    if (as<String>(data[i]) == "Infinity") {
      rv[i] = R_PosInf;
    } else {
      rv[i] = as<double>(data[i]);
    }
  }
  return rv;
}
')

convertThings(list('Infinity', 1.0))
# expected output c(Inf, 1.0)

我看到的错误是Error: not compatible with requested type。非常感谢帮助!

1 个答案:

答案 0 :(得分:3)

这是一个基本的C ++问题:如何可靠地将 text 转换为数字

Boost.Lexical_Cast库提供了一个可能的答案,并在this Rcpp Gallery post中进行了说明。只是使用第一个例子:

R> library(Rcpp)
R> sourceCpp("/tmp/boostLexicalCastExample.cpp")  # from post
R> lexcicalCast(c("Inf", "inf", "Infinity", "NA", 42))
[1] Inf Inf Inf  NA  42
R> 

正如您所看到的,它在文本中至少匹配三种不同的无限拼写方式。