Разбор json простой функции opencpu не работает

Привет, я хочу иметь простую функцию для моего локального сервера разработки opencpu.

getLinearInterpolatedEstimateQuantil <- function(x, type, probs){
  result = quantile(data, type, probs)
  result #print for simpler debug
}

Пример ввода отладки будет примерно таким:

{"type":1,"x":[1,2,3,4,5,6,7,8,9,10],"probs":[0.05,0.25,0.75,0.95]}

Но есть проблема: когда вы вводите вручную образцы данных, например:

debugInput = fromJSON(file("debugInput.json"))

код компилируется.

НО, когда я пытаюсь получить к нему доступ через http, например:

opencpu$browse("library/myLibrary")
curl http://localhost:3469/ocpu/library/predictR/R/getLinearInterpolatedEstimateQuantil/Json -d '{"type":1,"x":[1,2,3,4,5,6,7,8,9,10],"probs":[0.05,0.25,0.75,0.95]}

'-H "Content-Type: application / json"

Я получаю только как вывод:

    unused arguments (type = 1, probs = probs)
In call:
getLinearInterpolatedEstimateQuantil(type = 1L, x = x, probs = probs)

Итак, я ожидаю, что при синтаксическом разборе возникнут проблемы с массивами?

Надеюсь, ты скажешь мне, что не так с моим кодом.

Изменить: я узнал, что opencpu выполняет синтаксический анализ json за меня. Однако код по-прежнему не работает. (https://www.opencpu.org/posts/scoring-engine/) Изменить: все еще не работает Изменить: Странно: вызов собственной функции работает:

curl http://localhost:5112/ocpu/library/stats/R/quantile/json -d '{"type":1,"x":[1,2,3,4,5,6,7,8,9,10],"probs":[0.05,0.25,0.75,0.95]}' -H "Content-Type: application/json"

однако вызов моей собственной функции приводит к ошибке:

curl http://localhost:5112/ocpu/library/predictR/R/getLinearInterpolatedEstimateQuantil/json -d '{"type":1,"x":[1,2,3,4,5,6,7,8,9,10],"probs":[0.05,0.25,0.75,0.95]}' -H "Content-Type: application/json"
unused arguments (type = 1, probs = probs)
In call:
getLinearInterpolatedEstimateQuantil(type = 1L, x = x, probs = probs)

для разъяснения здесь снова моя функция:

getLinearInterpolatedEstimateQuantil <- function(x){
  result = quantile(data, type, probs)
  return (result)
}

ИЗМЕНИТЬ снова:

library(jsonlite)
myFunction <- function(x, type, probs){
result = quantile(x, type, probs)
return (result)
}

json <- '{"type":1,"x":[1,2,3,4,5,6,7,8,9,10],"probs":[0.05,0.25,0.75,0.95]}'
args <- fromJSON(json)
do.call(myFunction, args)

Результаты в

100% 
10 

Warning message:
In if (na.rm) x <- x[!is.na(x)] else if (anyNA(x)) stop("missing values and NaN's not allowed if 'na.rm' is FALSE") :
  Bedingung hat Länge > 1 und nur das erste Element wird benutzt

И

do.call(stats::quantile, args)

Результаты в

5% 25% 75% 95% 
  1   3   8  10 

Почему первый вызов приводит к предупреждению с другим выводом? Почему работает второй звонок?


person Georg Heiler    schedule 02.06.2015    source источник
comment
С первого взгляда: вы определяете функцию (x), но в вашем JSON также есть type и probs; что соответствует сообщению об ошибке. Не следует ли декларировать эти параметры? Кроме того, ваша функция в настоящее время игнорирует x, но использует data, которого мы раньше не видели.   -  person Silly Freak    schedule 03.06.2015
comment
Ха почти там: это результат нативного вызова [1, 3, 8, 10], а это результат моей функции [10]   -  person Georg Heiler    schedule 03.06.2015


Ответы (1)


Для RCP с -H "Content-Type: application/json" имена верхнего уровня в вашем объекте JSON должны совпадать с именами параметров вашей функции. Вы можете проверить это следующим образом:

library(jsonlite)
json <- '{"type":1,"data":[1,2,3,4,5,6,7,8,9,10],"quantil":[0.05,0.25,0.75,0.95]}'
args <- fromJSON(json)
result <- do.call(getLinearInterpolatedEstimateQuantil, args)

Итак, если вы хотите использовать полезную нагрузку JSON как есть, ваша функция должна выглядеть так:

getLinearInterpolatedEstimateQuantil <- function(data, quantil, type = 1){

}

Например, чтобы напрямую вызвать функцию quantile:

curl http://public.opencpu.org/ocpu/library/stats/R/quantile/json -d \
'{"type":1,"x":[1,2,3,4,5,6,7,8,9,10],"probs":[0.05,0.25,0.75,0.95]}' \
-H "Content-Type: application/json"

Обратите внимание, что аргументы json blob type probs и x соответствуют именам параметров квантиля.

person Jeroen    schedule 02.06.2015
comment
Спасибо за совет. Я обновил свой код. Однако я все еще получаю сообщение об ошибке - person Georg Heiler; 02.06.2015
comment
Окончательным решением было вызвать квантиль, например: результат = квантиль (x = x, type = type, probs = probs) - person Georg Heiler; 03.06.2015