Использование выходного файла, хранящегося на сервере OpenCPU, в качестве входных данных для последующего вызова функции

Вопрос: как я могу использовать выходной файл, хранящийся на сервере OpenCPU, в качестве входных данных для другой функции?

Предыстория: я пытаюсь использовать knitr и markdown в openCPU для создания HTML-кода, который я могу использовать для обновления веб-страницы со статистической информацией о загрузке страницы.

Основной рабочий процесс выглядит следующим образом:

  1. Создайте файл .Rmd, сохраните локально.
  2. Получите доступ к веб-странице, которая использует AJAX для загрузки файла .Rmd в экземпляр OpenCPU на сервере.
  3. Используйте функцию knit через openCPU, чтобы превратить функцию в файл *.md, хранящийся на сервере.
  4. Используйте функцию markdownToHTML для файла, хранящегося на сервере (путем передачи соответствующего хэша, сгенерированного при вызове knit), и получите ответ AJAX, содержащий сгенерированный HTML.
  5. Обновите веб-страницу с помощью нового HTML.

В нынешнем виде этот процесс работает до шага 4. Я могу вызвать knit, передав файл .Rmd через POST-запрос формы, и получаю следующий ответ от OpenCPU:

{
"object" : "xa9eaea44e1",
"graphs" : [
    "xf31dcfe7f3"
],
"files" : {
    "figure" : "xfc55396fd8",
    "test.md" : "x7821c69f79"
}
}

где "test.md" — выходной файл, сгенерированный функцией knit. Теперь я пытаюсь использовать хэш (в данном случае "x7821c69f79", отправив сообщение POST в /R/pub/markdown/markdownToHTML/ascii со следующими параметрами:

file     /R/tmp/x7821c69f79/bin

Это возвращает ошибку HTTP 400 со следующим сообщением:

cannot open URL 'http://localhost/R/store/R/tmp/x7821c69f79/bin/rds'

Однако, когда я делаю запрос GET к /R/tmp/x7821c69f79/bin, возвращается содержимое test.md. Итак, я знаю, что файл сохраняется правильно при вызове knit.

Итак, что здесь происходит? Другими словами, как я могу использовать выходной файл, хранящийся на сервере OpenCPU, в качестве входных данных для другой функции?


person Eli Hooten    schedule 01.10.2012    source источник


Ответы (1)


Хм, ошибка /store выглядит как ошибка, я посмотрю на это.

Возможно, на шаге 3 вы можете заставить функцию возвращать содержимое test.md, например. заканчиваться на return(readLines(test.md))? Или, что еще лучше, выводите не в test.md, а в tmpfile() и возвращайте его содержимое. Таким образом, вывод сохраняется как объект R в хранилище, а не как необработанный файл, и вы можете просто передать аргумент, например. file=x7821c69f79 на шаге 4.

Вы видели пример приложения для уценки? См. исходный код здесь и здесь.

person Jeroen    schedule 01.10.2012
comment
вывод в tmpfile() был тем, что я изначально хотел, чтобы я мог полностью обойти проблему хранения файлов. Однако, судя по документации по Knitr, похоже, что функция Knit будет выводить данные только в файл. Возможно, я все еще мог бы обернуть его в свою собственную функцию и заставить ее возвращать содержимое файла таким образом, чтобы оно сохранялось в объекте R в хранилище. Чувак... как же я пропустил примеры уценки/вязания! Я посмотрю на них. - person Eli Hooten; 02.10.2012