2016-09-13 7 views
1

Когда я создаю группу связанных ящиков (выбор точек в одной квадратной ячейке выделяет соответствующие точки во всех ящиках), ящики автоматически обновляются неопределенное количество раз (иногда только один раз, но иногда до 20 раз).R Shiny, как остановить ggplot boxplots от обновления себя, как в группе связанных ящиков.

Пожалуйста, используйте следующий пример кода.

Я считаю, что источником проблемы является geom_jitter(). Есть ли способ остановить обновление ящиков? Благодарю.

library(shiny) 
library(ggplot2) 

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

    X = data.frame(x1 = rnorm(1000), 
       x2 = rnorm(1000), 
       week = sample(LETTERS[1:10],1000,replace = TRUE) 
       ) 

    D = reactive({ 
    brushedPoints(X,input$brush_1, allRows = TRUE) 
    }) 

    output$p1 = renderPlot({ 
    set.seed(123) 
    ggplot(D(),aes(x=week,y=x1))+ 
     geom_boxplot() + 
     geom_jitter(aes(color=selected_))+ 
     scale_color_manual(values = c("black","red"),guide=FALSE) 


    }) 

    output$p2 = renderPlot({ 
    set.seed(123) 
    ggplot(D(),aes(x=week,y=x2))+ 
     geom_boxplot() + 
     geom_jitter(aes(color=selected_))+ 
     scale_color_manual(values = c("black","red"),guide=FALSE) 

    }) 

} 

ui <- fluidPage(
    splitLayout(
    plotOutput("p1",brush = "brush_1"), 
    plotOutput("p2",brush = "brush_1") 
) 
) 

shinyApp(ui = ui, server = server) 

Update: 2016-9-16

Я попытался заменить geom_jitter с geom_point, но графики еще постоянно обновлять себя.

Таким образом, geom_jitter не может быть подозреваемым.

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

+0

Возможно, вы можете рассчитать дрожание заранее и вместо этого использовать 'geom_point'. – Axeman

+0

Также обратите внимание, что вы должны, вероятно, отключить точки выброса ящиков. – Axeman

+0

@Axeman Можете ли вы дать мне пример использования 'geom_point' для получения аналогичной диаграммы с точками, расположенными вокруг вертикального центра окна? Благодарю. – John

ответ

1
library(shiny) 
library(ggplot2) 

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

    X = data.frame(x1 = rnorm(1000), 
       x2 = rnorm(1000), 
       week = sample(LETTERS[1:10],1000,replace = TRUE) 
) 

    vals <- reactiveValues(
    keeprows = rep(TRUE,nrow(X)) 

) 

    D = reactive({ 
    R=cbind(X,vals$keeprows) 
    #print(sum(R[,"vals$keeprows"]==TRUE)) 
    R 
    }) 

    output$p1 = renderPlot({ 
    set.seed(123) 
     ggplot(D(),aes(x=week,y=x1))+ 
     geom_boxplot() + 
     geom_jitter(aes(colour=vals$keeprows))+ 
     scale_color_manual(values = c("black","red"),guide=FALSE) 


    }) 

    output$p2 = renderPlot({ 
    set.seed(123) 

    ggplot(D(),aes(x=week,y=x2))+ 
    geom_boxplot() + 
    geom_jitter(aes(color=vals$keeprows))+ 
    scale_color_manual(values = c("black","red"),guide=FALSE) 

    }) 

    observeEvent(input$brush_1,{ 
    Res=brushedPoints(X,input$brush_1,allRows = TRUE) 
    vals$keeprows = Res$selected_ 

    }) 

    observeEvent(input$brush_2,{ 
    Res=brushedPoints(X,input$brush_2,allRows = TRUE) 
    vals$keeprows = Res$selected_ 

    }) 

    observeEvent(input$exclude_reset,{ 
    vals$keeprows = rep(TRUE,nrow(X)) 

    }) 

} 

ui <- fluidPage(
    actionButton("exclude_reset","Reset"), 
    splitLayout(
    plotOutput("p1",brush = brushOpts("brush_1",resetOnNew = TRUE)), 
    plotOutput("p2",brush = brushOpts("brush_2",resetOnNew = TRUE)) 
) 
) 

shinyApp(ui = ui, server = server) 
1

Угадайте, почему исходная таблица всегда обновляется, когда вы чистите один из участков. потому что все ваши сюжеты используют один и тот же идентификатор кисти, не могут определить, какой вход $ brush_1 является действительным действием «кисти». Одна диаграмма была очищена, введена переменная $ brush_1, а также обновлена ​​реактивная таблица D. Еще один сюжет, основанный на новом графике реактивных таблиц, снова и снова вводит входной файл $ brush_1 ...

Сверху мышление на основе вашего кода сделало новый, чтобы отличить действие кисти ввода от разных графиков. проблема в том, что коробочки постоянно обновляют себя за неопределенное количество раз, кажется, решена. PLS попробуйте под кодом: