2017-12-12 4 views
0

ですJSON形式に変換します。はRとアンシリアライズYAMLの列ができません:NASが強制によって導入さ:3.0私はYAMLからWebアプリケーションによって生成された列をアンシリアライズしようとすると、Rに、バージョン2.1.15でYAMLパッケージを使用しています実際の範囲外

> tbl %>% 
+ select(value) %>% 
+ collect() %>% 
+ head(20) 
# A tibble: 20 x 1 
                     value 
                     <chr> 
1                "--- []\n" 
2                "--- []\n" 
3      "---\n- - unknown\n - 383.0\n- - hd720\n - 425.0\n" 
4                "--- []\n" 
5            "---\n- - hd720\n - 102.0\n" 
6            "---\n- - unknown\n - 0.0\n" 
7                "--- []\n" 
8      "---\n- - unknown\n - 301.0\n- - hd1080\n - 1.0\n" 
9                "--- []\n" 
10           "---\n- - hd1080\n - 1103.0\n" 
11                "--- []\n" 
12                "--- []\n" 
13           "---\n- - hd1080\n - 803.0\n" 
14            "---\n- - hd720\n - 143.0\n" 
15                "--- []\n" 
16                "--- []\n" 
17 "---\n- - unknown\n - 9.0\n- - hd1080\n - 102.0\n- - hd720\n - 37.0\n" 
18           "---\n- - unknown\n - 136.0\n" 
19            "---\n- - hd720\n - 973.0\n" 
20      "---\n- - unknown\n - 330.0\n- - hd1080\n - 3.0\n" 

私は次の関数を使用して、このコラムをアンシリアライズしよう:

df = read.csv("test.txt") 
df %>% 
    rowwise() %>% 
    mutate(
    unserialized_value = ifelse(
     is.recursive(yaml.load(value)) || is.vector(yaml.load(value)), 
     as.character(toJSON(yaml.load(value))), 
     as.character(yaml.load(value))) 
) %>% 
    View() 

私は機能と同じように実装しました:

unserialize_value <- function(val) { 
    if (length(val) != 1) { 
    stop("unserialize_value input must be of length 1") 
    } 
    if (is.na(val)) { 
    return(NA) 
    } else { 
    print(paste("orig val:", val)) 
    yaml_val = yaml.load(val) 
    print(paste("YAML val:", yaml_val)) 
    if (is.recursive(yaml_val) || is.vector(yaml_val)) { 
     print("returning list") 
     return(as.character(toJSON(yaml_val))) 
    } else { 
     print("returning char") 
     return(as.character(yaml_val)) 
    } 
    } 
} 

mutateでこの機能を使用する場合(ただし、

:)インラインコードを使用しているときも、私はこのような出力(デバッグ文)を取得します

そして実際、数字はこれらのエラーのために、NA秒になっています

1: In yaml.load(value) : NAs introduced by coercion: 301.0 is out of real range 
2: In yaml.load(value) : NAs introduced by coercion: 1.0 is out of real range 
3: In yaml.load(value) : NAs introduced by coercion: 301.0 is out of 
... 

ファイルはここにある:興味深いことにtest.txt

、私が行うとき:

toJSON(yaml.load("---\n- - unknown\n - 330.0\n- - hd1080\n - 3.0\n")) 

正常に動作します。

[[["unknown"],[330]],[["hd1080"],[3]]] 

dplyr/mutateコールで変換がうまくいきませんか?

答えて

0

私はちょうどあなたのコードを実行し、すべてのケースで正常に動作しました。私はロードされたライブラリにバージョンの違いがあると思う。比較のためにsessionInfo()出力を含めてください。

はここに私のものだ:更新

> sessionInfo() 
R version 3.4.3 (2017-11-30) 
Platform: x86_64-pc-linux-gnu (64-bit) 
Running under: Ubuntu 16.04 LTS 

Matrix products: default 
BLAS: /usr/lib/openblas-base/libblas.so.3 
LAPACK: /usr/lib/libopenblasp-r0.2.18.so 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8  LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] bindrcpp_0.2 dplyr_0.7.4 magrittr_1.5 yaml_2.1.15 jsonlite_1.5 

loaded via a namespace (and not attached): 
[1] compiler_3.4.3 assertthat_0.2.0 R6_2.2.2   tools_3.4.3  glue_1.2.0  tibble_1.3.4  
[7] Rcpp_0.12.13  pkgconfig_2.0.1 rlang_0.1.2  bindr_0.1 

==== 、バグは、r-YAMLの最新バージョンにパッチが適用されています。根本的な原因は、変換時にerrnoを追加エラーチェックしていたためです。これはc stdlibの共有グローバルなので、c stdlibを使って何かで設定することができます。この場合、jsonliteは数値ゼロのlog10を使います。これはerrnoを設定し、後で変換時にエラーとして検出されました。解決策は、r-yamlパッケージでstrtolまたはstrtoiを使用する前にerrnoをクリアすることでした。

TL; DRがCRANから最新のR-YAMLをインストールします。

+0

あなたはGitHubの上spgarbetている場合は、バグ/バグ修正を指すように、あなたの投稿を編集して自由に感じます! – slhck

関連する問題