我正在创建我的第一个Shiny应用程序,当用户使用鼠标事件与ggplot对象(plot)交互时返回数据表。使用来自RStudio的this example,我已经能够根据x轴(切割)上的位置生成过滤并返回数据表(菱形)的东西。它差不多......但是,我有两个我无法解决的突出问题:
这是我使用可重现代码的地方:
library(shiny)
library(dplyr)
library(ggplot2)
ui <- fluidPage(
fluidRow(
plotOutput("plot1", click = "plot1_click")),
fluidRow(column(width = 10, dataTableOutput("selected_rows"))))
server <- function(input, output) {
is.even <- function(x) x %% 2 == 0
plot <- diamonds %>%
mutate(cut = as.factor(cut)) %>%
mutate(colour = as.factor(color)) %>%
mutate(type = is.even(price)) %>%
group_by(type, color, cut) %>%
count()
output$plot1 <- renderPlot({
ggplot(plot, aes(x = cut, y = color, colour = type)) +
geom_point(aes(size = n)) +
facet_grid(~type) +
theme(legend.position = "none")
})
output$selected_rows <- renderDataTable({
if (is.null(input$plot1_click$x)) return()
keeprows <- round(input$plot1_click$x) == as.numeric(diamonds$cut)
diamonds[keeprows, ]
})
}
shinyApp(ui, server)
任何帮助将非常感激。提前致谢。
我相信如果你在output$selected_rows
中做更多的逻辑,这是可能的。要通过y
变量进行过滤,只需添加对input$plot1_click$y
的引用即可。对于facet
(或panels
),你会想要使用input$plot1_click$panelvar1
:
keeprows_x <- round(input$plot1_click$x) == as.numeric(diamonds$cut)
keeprows_y <- round(input$plot1_click$y) == as.numeric(diamonds$color)
keeprows_panel <- input$plot1_click$panelvar1 == is.even(diamonds$price)
diamonds[keeprows_x & keeprows_y & keeprows_panel, ]
注意:我用type
模仿is.even(diamonds$price)
的逻辑。您可能希望查看this github issue以获得进一步的讨论和解决方案。