Можно ли сохранять данные между обращениями к серверу openCPU?

Я понимаю, что интерфейс OpenCPU - RESTful. Тем не менее, я хотел бы сохранять данные между вызовами функций, если это возможно.

Я наивно создал следующий пакет:

vals <- c()

fnInit <- function() {
  vals <<- c('a','b','c')
}

но я получил ошибку: не могу изменить значение заблокированной привязки для «vals», когда я вызвал функцию fnInit. Я понимаю, почему это происходит.

Затем я попытался:

fnBoth <- local({
  vals <- c('a','b','c')
  function(which) {
    if (which == 0) {
      vals
    } else if (which == 1) {
      vals <<- c(vals,'d')
      vals
    }
  }
})

но каждый раз, когда я отправляю POST в функцию fnBoth, с которой = 1, я получаю один и тот же ответ: [1] "a" "b" "c" "d"

Если я снова вызову функцию, я получу тот же ответ. Таким образом, может показаться, что значение vals каждый раз сбрасывается.

Мой вопрос: можно ли сохранять данные между вызовами функций? Вышеупомянутые попытки не претендуют на то, чтобы быть исчерпывающими - может быть, есть другой метод? Или я должен просто сохранить значение на диск?

Спасибо


person P C Marks    schedule 27.08.2013    source источник


Ответы (1)


Мне не совсем понятно, чего вы пытаетесь достичь, возможно, вы можете немного уточнить тип приложения, которое хотите создать.

OpenCPU поддерживает цепочку вызовов функций для вычисления, например. f(g(x), h(y)). Это делается путем передачи идентификатора сеанса завершенного вызова в качестве аргумента последующему. Ознакомьтесь с документацией о форматах аргументов: https://public.opencpu.org/api.html#api-arguments. Он включает пример, иллюстрирующий это путем вычисления summary(read.csv("mydata.csv")):

#upload local file mydata.csv
curl https://public.opencpu.org/ocpu/library/utils/R/read.csv -F "[email protected]"

#replace session id with returned one above
curl https://public.opencpu.org/ocpu/tmp/x067b4172/R/.val/print
curl https://public.opencpu.org/ocpu/library/base/R/summary -d 'object=x067b4172'

Первый запрос вызывает функцию read.csv, которая возвращает кадр данных. В последней строке мы вызываем функцию summary, где мы устанавливаем аргумент object равным выходным данным предыдущего вызова (т. е. кадру данных), передавая идентификатор сеанса.

person Jeroen    schedule 27.08.2013
comment
Мой пользователь будет вводить текст в поле формы select2, что означает, что нажатия клавиш отправляются на сервер, когда они набираются. Я использую нажатия клавиш для сопоставления со списком из 12 000 символов, возвращая список тех символов, которые соответствуют (подстрока). Я хочу иметь возможность получать список символов один раз, а не каждый раз, когда нажатие клавиши вызывает вызов сервера. - person P C Marks; 28.08.2013
comment
Я не понимаю, как это связано с вашим вопросом? Похоже, вам просто нужен дескриптор select2 в javascript? Что вам нужно от R/OpenCPU? - person Jeroen; 28.08.2013
comment
Прошу прощения за недостаточно ясность. Да, select2 используется в функции javascript. select2 выполняет обратные вызовы ajax на сервер, когда пользователь вводит данные в поле. Я использую запросы ajax, потому что обнаружил, что мне нужно хранить список символов на стороне сервера; это слишком много для клиентской стороны. Итак, я хотел бы использовать функцию OpenCPU/R на стороне сервера для обработки вызовов ajax. Он будет выполнять поиск в списке символов и возвращать совпадения. Список (12 000 символов генов) хранится в базе данных. Я пытался избежать загрузки этих символов каждый раз, когда вызывается эта функция. - person P C Marks; 28.08.2013