20

次の double 値のベクトルがありますx。各要素は POSIX 日時を表します

x <- c(1417621083, 1417621204, 1417621384, 1417621564, 1417621623)

RJSONIOパッケージを使用しており、引き続き使用したいと考えています。

演習として、これらの値を JSON テキストに変換し、R に再度読み込んでみたいと思いますが、日時表現を簡単なリスト結果に変換するのに苦労しています。JSON では、日付を特別な形式にする必要があるため、値xは次のように変換されます。

dates <- c("/new Date(1417621083)", "/Date(1417621204)", "/Date(1417621384)", 
           "/Date(1417621564)", "/Date(1417621623)")

RJSONIOパーサーdatesを介して 2 番目の任意のベクトルを実行すると、すべてがスムーズに進むように見えます。

library(RJSONIO)
make <- toJSON(list(date = dates, value = LETTERS))

次に、日付の R-json C ルーチンでオプションを使用して新しい JSON テキストを解析するstringFunと、結果は 2 つの要素のリストになります。最初の要素はリストで、2 番目の要素は原子ベクトルです。

(read <- fromJSON(make, stringFun = "R_json_dateStringOp"))
# $date
# $date[[1]]
# [1] "2014-12-03 07:38:03 PST"
# 
# $date[[2]]
# [1] "2014-12-03 07:40:04 PST"
# 
# $date[[3]]
# [1] "2014-12-03 07:43:04 PST"
# 
# $date[[4]]
# [1] "2014-12-03 07:46:04 PST"
# 
# $date[[5]]
# [1] "2014-12-03 07:47:03 PST"
# 
# 
# $value
# [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"
# [14] "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

しかし、私は 2 つのベクトルのリストを期待していました。

# $date
# [1] "2014-12-03 07:38:03 PST" "2014-12-03 07:40:04 PST"
# [3] "2014-12-03 07:43:04 PST" "2014-12-03 07:46:04 PST"
# [5] "2014-12-03 07:47:03 PST"
# 
# $value
# [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q"
# [18] "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

への呼び出し内から結果を単純化する方法をいくつか試しましたがfromJSON()、どれもうまくいきませんでした。ここに私の試みのいくつかがあります:

ハンドラーの使用 :これにより結果が単純化されますが、日付の再フォーマットに失敗します

h1 <- basicJSONHandler(simplify = TRUE)
fromJSON(make, handler = h1, stringFun = "R_json_dateStringOp")
# $date
# [1] "/new Date(1417621083)" "/Date(1417621204)"    
# [3] "/Date(1417621384)"     "/Date(1417621564)"    
# [5] "/Date(1417621623)"    
# 
# $value
# [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"
# [14] "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

simplify 議論を試す:はこれのいくつかの異なる種類を試しましたが、どれもうまくいきませんでした.

fromJSON(make, simplify = StrictCharacter)
# $date
# [1] "/new Date(1417621083)" "/Date(1417621204)"    
# [3] "/Date(1417621384)"     "/Date(1417621564)"    
# [5] "/Date(1417621623)"    
#
# $value
#  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"
# [14] "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

への呼び出しで日付の結果を単純化する方法はありfromJSON()ますか?

4

3 に答える 3

3

read私が推測している値から、望ましい出発点です...これは1つの方法です:

> dd <- sapply(read, c) 
> class(dd) <- "POSIXct"
> dd
[1] "2014-12-03 07:38:03 PST" "2014-12-03 07:40:04 PST" "2014-12-03 07:43:04 PST"
[4] "2014-12-03 07:46:04 PST" "2014-12-03 07:47:03 PST"

クラス強制は一種の「汚い」ものですが、属性を保持するために、unlist他の (失敗しsapply( read,"[[",1)た) 戦略をかなり試していました。sapply(read, c)

于 2014-12-05T01:56:18.547 に答える
0

報奨金が期限切れになり、現在これを行うことができないことが判明したRJSONIOため (またはそのように思われる)、他のユーザーがこの問題に遭遇し、解決策が必要な場合に備えて、別の代替方法としてこれを提示します.

パッケージjsonliteはこの操作を簡単に行うことができます。POSIXt数値ベクトルにクラスを追加し、"mongo"エクスポートされていない関数でパーサーを指定するだけですasJSON

# unloadNamespace(RJSONIO)  ## to avoid confusion between packages
library(jsonlite)    

x <- c(1417621083, 1417621204, 1417621384, 1417621564, 1417621623)

class(x) <- "POSIXt"    

data <- list(dates = x, values = letters[1:5])

json <- jsonlite:::asJSON(data, POSIXt = "mongo")

fromJSON(json)
# $dates
# [1] "2014-12-03 07:38:03 PST" "2014-12-03 07:40:04 PST"
# [3] "2014-12-03 07:43:04 PST" "2014-12-03 07:46:04 PST"
# [5] "2014-12-03 07:47:03 PST"
# 
# $values
# [1] "a" "b" "c" "d" "e"
于 2014-12-07T01:59:29.203 に答える