2016-02-23 3 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 не кричать на меня обПреобразование строковых версий «Бесконечность» в числовое значение в 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

Именно то, что я искал, большое спасибо Dirk! – sergeygoder

Смежные вопросы