我有一些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
。非常感谢帮助!
答案 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>
正如您所看到的,它在文本中至少匹配三种不同的无限拼写方式。