2016-02-23 67 views
1

我有一些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不要對我大喊大叫約將字符串版本的「Infinity」轉換爲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。非常感謝幫助!

回答

3

這是一個基本的C++問題:如何可靠地將文本轉換爲號碼

一個可能的答案由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> 

正如你所看到的,它匹配文本拼寫無限的至少三種不同的方式。

+0

正是我在找的東西,非常感謝德克! – sergeygoder