R Shiny,如何阻止 ggplot boxplots 在一组链接的 boxplots 中更新自己
R Shiny, how to stop ggplot boxplots from updating themselves as in a group of linked boxplots
当我创建一组链接的箱线图时(在一个箱线图中选择点会突出显示所有箱线图中的对应点),箱线图会不断更新自己不确定的次数(有时只有一次,但有时最多 20 次) .
请运行下面的示例代码。
我相信问题的根源是 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)
更新时间:2016-9-16
我尝试用 geom_point
替换 geom_jitter
,但图表仍在不断更新。
所以geom_jitter
可能不是嫌疑人
那么到底问题的根源是什么?
猜想是来源table刷了一个地块就一直在更新。因为你所有的地块都使用相同的刷子id,无法识别哪个输入$brush_1是真正的"brush"动作。一张图刷完了,input$brush_1改了,reactivetableD也会更新。另一个基于新的反应 table 的图再次绘制并使输入 $brush_1 再次改变...
基于以上思路,根据你的代码,新做了一个区分输入画笔动作和不同plots的代码。箱线图不断更新自己不确定次数的问题似乎已经解决。请尝试以下代码:
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)
当我创建一组链接的箱线图时(在一个箱线图中选择点会突出显示所有箱线图中的对应点),箱线图会不断更新自己不确定的次数(有时只有一次,但有时最多 20 次) .
请运行下面的示例代码。
我相信问题的根源是 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)
更新时间:2016-9-16
我尝试用 geom_point
替换 geom_jitter
,但图表仍在不断更新。
所以geom_jitter
可能不是嫌疑人
那么到底问题的根源是什么?
猜想是来源table刷了一个地块就一直在更新。因为你所有的地块都使用相同的刷子id,无法识别哪个输入$brush_1是真正的"brush"动作。一张图刷完了,input$brush_1改了,reactivetableD也会更新。另一个基于新的反应 table 的图再次绘制并使输入 $brush_1 再次改变...
基于以上思路,根据你的代码,新做了一个区分输入画笔动作和不同plots的代码。箱线图不断更新自己不确定次数的问题似乎已经解决。请尝试以下代码:
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)