Есть ли простой способ изменить параметр постфикса по умолчанию «/ json» в data.frames, чтобы он был основан на столбцах, а не на основе строк?
Data.frames в R, если я правильно понимаю, на самом деле просто именованные списки, где каждый список имеет ту же длину, что и другие. С помощью 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 ] }"
где последние три одинаковы. Легко заставить его выглядеть одинаково, используя аргумент dataframe
для toJSON
или заменив data.frame
на list
.
При использовании API OpenCPU вызовы выглядят одинаково:
$ 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
]
}
Три вопроса:
Есть ли способ изменить поведение авто-JSON-ификации OpenCPU по умолчанию на основе столбцов?
Есть ли причина (кроме того, что «приходилось что-то делать по умолчанию»), по которой по умолчанию используется строка? (Чтобы я мог лучше понять основы и эффективность, а не вызов.)
Тем не менее, это все академический подход, поскольку большинство (если не все) библиотек, принимающих вывод JSON, будут прозрачно понимать и переводить между форматами. Верно?
(Win7 x64, R 3.0.3, opencpu 1.2.3, jsonlite 0.9.4)
(PS: Спасибо, Jeroen, OpenCPU великолепен! Чем больше я играю, тем больше мне нравится.)