2016-12-19 3 views
2

Общей целиUpdate большие участки в Shiny без повторного рендеринга

Я хотел бы иметь возможность использовать RShiny быстро построить большие объемы данных, что исходит от R, а затем внести небольшие изменения или дополнения без повторного -обеспечение всех построенных данных.

Конкретные задачи

  1. Участок большого количества точек (< 100 000) в графике рассеяния. Я в порядке с короткой (< 5 секунд), но заметной задержкой в ​​этой задаче.
  2. В ответ на щелчок мышью найдите ближайшую нанесенную точку.
  3. Используя некоторую информацию, запрошенную из данных, относящихся к этой точке, выделите небольшое количество других точек (< 10). Я хотел бы, чтобы это было мгновенно.

Текущий подход

Я в настоящее время используют ggplot2 и RShiny, чтобы приложения, чтобы помочь с анализом данных. В общем, я очень доволен этой комбинацией. Поэтому в идеале это решение позволит мне в основном использовать эти инструменты.

Используя только встроенную функциональность RShiny и ggplot2, у меня нет никаких проблем выполнения своей задачи, за исключением, что шаг 3 не может быть сделано независимо друг от друга, без переделывания шага 1. Это мое понимание того, что это не представляется возможным обновлять или накладывать графики ggplot2 без повторной рендеринга их в полном объеме.

Итак, что я ищу, это один из следующих действий для достижения своей общей цели, в порядке убывания предпочтения:

  1. Способ наложения или модифицировать ggplot2 участки без повторного рендеринга.
  2. Расширение или вилка или аналогичные R-based на ggplot2, что позволяет это.
  3. Альтернатива ggplot2, которая также легко интегрируется с данными RShiny и R, которые могут это позволить. Может быть, какой-то интерфейс к существующей библиотеке javascript? Я все равно хотел бы иметь возможность манипулировать и взаимодействовать с моим сюжетом, используя все машины RShiny, с которыми я знаком.

У меня есть некоторые знания о js, но я не хочу изучать что-то вроде d3, чтобы выполнить такую ​​маленькую задачу. (Если для этого можно использовать небольшой бит d3 или js, это было бы здорово!) Было бы хорошо, если бы можно было эффективно рисовать svg поверх графиков ggplot2, но используя ту же систему координат.

Я знаю this question, но предоставленное решение было специфичным для данных временных рядов.

+0

Вы посмотрели на 'plotly'? Он имеет некоторую интерактивность. Существует также 'ggvis', но он еще не закончен - видимо. –

+0

Я коротко посмотрел на сюжет. Мое впечатление было то, что функция ggplotly была очень медленной, чтобы выполнить шаг 1. Если есть способ использовать plotly с R в некотором урезанном пути, это может быть хорошо. Я не знаком с ggvis, может быть, это билет. – mb7744

+0

'ggvis' - следующая большая работа Хэдли Викама и предполагается добавить интерактивность к ggplot. К сожалению, оказалось, что требуется больше реструктуризации, чем он думал поначалу, так что это займет год или два дольше, чем первоначально было объявлено. –

ответ

0

Предлагаем решение с plotly. Он повторно отображает весь сюжет, но он быстро, поэтому, возможно, по-прежнему будет соответствовать вашим требованиям. Я думаю, вы увидите, что введение Plotly не должно нарушать ваш рабочий процесс.

Обратите внимание, что я использую Plotly's WebGL function для скорости. Пример ниже 100000 баллов. Я также включил пример того, как вы конвертируете существующий объект ggplot2. Для событий Plotly click, see this.

library(shiny) 
library(dplyr) 
library(plotly) 
library(ggplot2) 

ui <- fluidPage(

    titlePanel("Highlight nearby points"), 

    sidebarLayout(
    sidebarPanel(width=3, 
     p("Click on a point. Nearby points will be highlighted.") 
    ), 

    mainPanel(
     plotlyOutput("plot") 
    ) 
) 
) 

# Data 
df <- tibble(x = runif(1e+05,1,100), y = runif(1e+05,1,100)) 

server <- function(input, output, session) { 

    output$plot <- renderPlotly({ 

    # Gather click data 
    event.data <- event_data("plotly_click") 

    # Plotly object 
    p <- plot_ly(df, x = ~x, y = ~y, type = "scatter", mode = "markers") 

    # Alternative: use existing ggplot 

    # gg <- ggplot(df, aes(x = x, y = y)) + 
    # geom_point() 
    # 
    # p <- plotly_build(gg) 

    # End alternative 

    # Check for click data 
    if(!is.null(event.data)) { 

     # If click data exists, create new markers based on range criteria and use a different color 
     d <- filter(df, 
        x < event.data$x+10 & x > event.data$x-10, 
        y < event.data$y+10 & y > event.data$y-10) 
     p <- add_markers(p, data = d, color = I("red")) 

    } 

    # Use webGL for faster ploting of many points 
    p %>% toWebGL() 

    }) 
} 

# Run the application 
shinyApp(ui = ui, server = server) 
+0

Я очень ценю усилия, однако, по крайней мере, для меня это решение имеет худшую производительность, чем то же самое без заговора. Если по замыслу все еще требуется, чтобы сюжет был перестроен, я не вижу, что его использование добавило в отношении моей проблемы. – mb7744

+0

Сравните производительность с этим: https://gist.github.com/anonymous/380198a563e9dfce27a72b8c468315a2 – mb7744

+0

@ mb7744 Интересно, это на самом деле было немного медленнее для меня. Хорошо, я подумаю об этом еще немного, но я не уверен, как вы вывести объект сюжета без повторной рендеринга. Для обновления вывода необходимо аннулировать объект рендеринга. При этом он будет запускать весь код внутри рендера. –

Смежные вопросы