Обращение к графике OpenCPU из JavaScript после ocpu.call

У меня есть веб-приложение OpenCPU, которое (с точки зрения пользователя) одновременно обеспечивает как табличное, так и графическое представление прогнозов на основе моделей.

Прогнозы основаны на введенных пользователем входных данных (предиктор/независимые переменные), взятых из HTML-таблицы. Затем в R выполняются расчеты, и полученные данные (отклик/зависимые переменные плюс связанная статистика) используются как для обновления HTML-таблицы, так и для подачи сопутствующей графики.

Мое текущее решение выглядит следующим образом:

ocpu.rpc принимает пользовательский ввод, выполняет вычисления и возвращает обновления таблицы, которые применяются через JavaScript. После их применения…

ocpu.rplot задействован (как часть функции обратного вызова ocpu.rpc) для создания соответствующего изображения. (Обратите внимание, он ДОЛЖЕН учитывать обновления — отсюда и обратный вызов).

Хотя приведенное выше решение работает, я не могу не чувствовать, что есть более элегантное решение…

Из соображений эффективности я хотел бы обработать входную таблицу и создать весь табличный/графический вывод в единственном вызове функции R. Я с радостью могу это сделать, но у меня возникает проблема, когда я пытаюсь получить доступ к обоим наборам вывода через JavaScript. В частности:

  1. Я изо всех сил пытаюсь понять, как я могу получить графику, используя ocpu.rpc.
  2. Я изо всех сил пытаюсь понять, как я могу получить данные таблицы, используя ocpu.rplot.
  3. ocpu.call, кажется, путь вперед, поскольку я вижу оба элемента, а именно ocpu/tmp/key/R/.val и ocpu/tmp/key/graphics/1. .. Я могу получить обновления таблицы, хранящиеся в первом, с помощью вспомогательной функции getObject(), но, несмотря на мои усилия, у меня возникают проблемы с графикой.

Любая помощь/совет будут высоко оценены!


person Richard Blades    schedule 06.05.2016    source источник


Ответы (1)


Думал, что опубликую свой собственный ответ, так как он может помочь другим... Входные данные передаются в единственную функцию R через ocpu.call. Обновления таблицы возвращаются и применяются с помощью JavaScript, в то время как сопутствующая графика (на основе тех же расчетов) сохраняется на сервере. Затем изображение применяется к экрану, как показано ниже. (Код имитирует графическую обработку ocpu.rplot).

<div id="outputAreaGraphics"></div>     

<style>
    #outputAreaGraphics {
        background: white;
        background-position: center center;
        background-repeat: no-repeat;   
        background-size: 100% 100%;     
        height: 600px;
        position: relative;
        width: 100%;
    }
</style>

<script>
    var graphics    = $("#outputAreaGraphics");     
    var pngHeight   = graphics.height();
    var pngWidth    = graphics.width();
    var graphicsURL = session1.getLoc() + "graphics/last/";

    var spinner = $("<span />")
        .appendTo(graphics)
        .attr({style : "font-family: monospace; left: 20px; position: absolute; top: 20px; z-index: 1000; "})
        .text("loading...");

    graphics.css("background-image", "url(" + graphicsURL + "png?width=" +
        pngWidth + "&height=" + pngHeight + ")");

    spinner.hide();

    var pdf = $("<a />")
        .appendTo(graphics)
        .attr({href: graphicsURL + "pdf?width=11.69&height=8.27&paper=a4r", style: "font-family: monospace; position: absolute; right: 10px; text-decoration: underline; top: 10px; z-index: 1000;", target: "_blank"})
        .text("pdf");

    var png = $("<a />")
        .appendTo(graphics)
        .attr({href: graphicsURL + "png?width=800&height=600", style: "font-family: monospace; position: absolute; right: 10px; text-decoration: underline; top: 50px; z-index: 1000;", target: "_blank",})
        .text("png");

    var svg = $("<a />")            
        .appendTo(graphics)
        .attr({href: graphicsURL + "svg?width=11.69&height=8.27", style: "font-family: monospace; position: absolute; right: 10px; text-decoration: underline; top: 30px; z-index: 1000;", target: "_blank"})
        .text("svg");
</script>
person Richard Blades    schedule 10.05.2016