3

data.frames のデフォルトの "/json" 後置オプションを列ベースから行ベースに変更するきれいな方法はありますか?

R の Data.frames は、私が正しく理解している場合、実際には、各リストが他のリストと同じ長さの名前付きリストです。を使用するjsonliteと、違いを簡単に示すことができます (簡単な例、はい):

library(jsonlite)
ll <- list(xx=1:3, yy=6:8)
dd <- data.frame(xx=1:3, yy=6:8)
toJSON(dd)
# [1] "[ { \"xx\" : 1, \"yy\" : 6 }, { \"xx\" : 2, \"yy\" : 7 }, { \"xx\" : 3, \"yy\" : 8 } ]"
toJSON(ll)
# [1] "{ \"xx\" : [ 1, 2, 3 ], \"yy\" : [ 6, 7, 8 ] }"
toJSON(dd, dataframe='column')
# [1] "{ \"xx\" : [ 1, 2, 3 ], \"yy\" : [ 6, 7, 8 ] }"
toJSON(as.list(dd))
# [1] "{ \"xx\" : [ 1, 2, 3 ], \"yy\" : [ 6, 7, 8 ] }"

最後の 3 つは同一です。dataframe引数 toを使用するかtoJSONdata.frameを aに強制することによって、強制的に同じように見せるのは簡単listです。

OpenCPU の API を使用すると、呼び出しは次のようになります。

$ curl http://localhost:7177/ocpu/library/base/R/list/json -H "Content-Type: application/json" -d '{ "xx":[1,2,3], "yy":[6,7,8] }'
{
        "xx" : [
                1,
                2,
                3
        ],
        "yy" : [
                6,
                7,
                8
        ]
}

$ curl http://localhost:7177/ocpu/library/base/R/data.frame/json -H "Content-Type: application/json" -d '{ "xx":[1,2,3], "yy":[6,7,8] }'
[
        {
                "xx" : 1,
                "yy" : 6
        },
        {
                "xx" : 2,
                "yy" : 7
        },
        {
                "xx" : 3,
                "yy" : 8
        }
]

data.frameそれ自体を JSON 化された列ベースにしたい場合は、次のように強制する必要がありlistます。

$ curl http://localhost:7177/ocpu/library/base/R/data.frame -H "Content-Type: application/json" -d '{ "xx":[1,2,3], "yy":[6,7,8] }'
/ocpu/tmp/x000a0fb8/R/.val
/ocpu/tmp/x000a0fb8/stdout
/ocpu/tmp/x000a0fb8/source
/ocpu/tmp/x000a0fb8/console
/ocpu/tmp/x000a0fb8/info

$ curl http://localhost:7177/ocpu/library/base/R/as.list/json -d "x=x000a0fb8"
{
        "xx" : [
                1,
                2,
                3
        ],
        "yy" : [
                6,
                7,
                8
        ]
}

3 つの質問:

  1. OpenCPU 自動 JSON 化のデフォルトの動作を列ベースに変更する方法はありますか?

  2. デフォルトで行ベースになっている理由はありますか (「何かをデフォルトにする必要があった」以外に) ? (基盤と効率をよりよく理解できるようにするためであり、挑戦を意図したものではありません。)

  3. ただし、JSON 出力を受け入れるほとんどの (すべてではないにしても) ライブラリは、フォーマット間を透過的に理解し、変換するため、これはすべて学術的なものです。右?

(Win7 x64、R 3.0.3、opencpu 1.2.3、jsonlite 0.9.4)

(PS: ありがとう、Jeroen、OpenCPU は最高です! プレイすればするほど、もっと好きになります。)

4

2 に答える 2

3

dataframeオブジェクトの場合、引数を使用および設定HTTP GETできます。dataframe

GET http://localhost:7177/ocpu/tmp/x000a0fb8/json?dataframe=rows

たとえば、パッケージのBostonオブジェクトもデータフレームです。MASS

https://cran.ocpu.io/MASS/data/Boston/json?dataframe=columns
https://cran.ocpu.io/MASS/data/Boston/json?dataframe=rows

エンドポイントへHTTP GETのリクエストでは.../json、すべての http パラメーターがjsonlite パッケージtoJSONの関数の引数にマップされます。他の引数を指定することもできます:toJSON

https://cran.ocpu.io/MASS/data/Boston/json?dataframe=columns&digits=4

使用可能な引数を確認するには、jsonlite のマニュアルまたはこの投稿をご覧ください。

これは、2 段階の手順を実行した場合にのみ機能することに注意してください。最初にHTTP POSTを返す関数に対して を実行し、次にリクエストを使用してそのオブジェクトを形式でdataframe取得します。でリクエストを修正する 1 ステップのショートカットを実行する場合、パラメータを指定することはできません。これは、リクエストでは HTTP パラメータが常に関数呼び出しにマップされるためです。jsonHTTP GETtoJSONPOST/jsonPOST

このデフォルトの理由は、行ベースの設計が表形式のデータをエンコードする最も一般的で相互運用可能な方法であると思われるためです。jsonlite paper/vignetteは、さらに詳細になります。逆の方法でも機能することに注意してください。data.frame関数を呼び出してデータフレームを作成する必要はなく、次の形式で引数を投稿するだけです。

[{"xx":1,"yy":6},{"xx":2,"yy":7},{"xx":3,"yy":8}]

自動的にデータ フレームに変換します。

curl https://public.opencpu.org/ocpu/library/base/R/summary/console -d object='[{"xx":1,"yy":6},{"xx":2,"yy":7},{"xx":3,"yy":8}]'
于 2014-03-28T20:45:07.333 に答える