簡體   English   中英

通過在 shiny 應用程序 r 中單擊 plotly 來排除數據點

[英]Exclude data points by click in plotly in a shiny app r

我想排除用戶通過單擊選擇的某些數據點,就像在這個例子中一樣(但使用情節)。 我試圖用下面顯示的代碼來做,但它不起作用。

我正在嘗試做的是識別數據點的 position,然后一旦我得到 position,如果row_number()在所選數據點集中,則將 var delete設置為TRUE ,然后過濾器deleteTRUE .

我不知道這是否是最有效的形式。

我將不勝感激任何幫助或指導。

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


n   <- 20
x   <- 1:n 
y   <- cumsum(rnorm(n))
z   <- runif(n,10,200)
cat <- sample(letters[1:5],n,replace = TRUE)
delete <- FALSE


df<-data.frame(cat,x,y,z, delete)

ui <- fluidPage(
  
  selectInput("var","var", c("y","z"), "y"),
  mainPanel(plotlyOutput("plot")),
  verbatimTextOutput("selection"),
  actionButton("delete","Delete", style = "display:inline-block;"),
  actionButton("reset","Reset", style = "display:inline-block;"),
  
  
)

server <- function(input, output, session) {
  
  myData <- reactive({df})
  
  output$plot <- renderPlotly({
   
   plot_ly(myData(), 
           x = ~x,
           y = ~get(input$var), 
           type = "scatter", 
           mode = "markers",
           text = ~cat,
           marker = list(size = 10),
           source = "A")
   
   
 })
  
  p1 <- reactive({

   event_data("plotly_click", source = "A")

 })

  p2 <- reactiveValues(points = c())

  observeEvent(p1(),{

   p2$points <- c(p2$points,as.list(p1())$pointNumber)

 })

  observeEvent(input$reset,{

   p2$points <- c()

 })

  output$selection <- renderPrint({ if(length(p2$points+1)<1){"Select data points to delete"}else{(p2$points+1)} })


 observeEvent(input$delete,{

   myData()  <- myData() %>%
       mutate(delete = ifelse(row_number() %in% c(p2$puntos+1),TRUE,delete)) %>%
       filter(!delete)
 })


}

shinyApp(ui, server)

那里有event_data的好技巧! 我認為所有需要做的不同就是使myData$df成為一個命名的reactiveValue (對p2$points進行小幅修正)。 這現在對我有用:

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


n   <- 20
x   <- 1:n 
y   <- cumsum(rnorm(n))
z   <- runif(n,10,200)
cat <- sample(letters[1:5],n,replace = TRUE)
delete <- FALSE


df<-data.frame(cat,x,y,z, delete)

ui <- fluidPage(
  
  selectInput("var","var", c("y","z"), "y"),
  mainPanel(plotlyOutput("plot")),
  verbatimTextOutput("selection"),
  actionButton("delete","Delete", style = "display:inline-block;"),
  actionButton("reset","Reset", style = "display:inline-block;"),
  
  
)

server <- function(input, output, session) {
  
  myData <- reactiveValues(df = df)
  
  output$plot <- renderPlotly({
    
    plot_ly(myData$df, 
            x = ~x,
            y = ~get(input$var), 
            type = "scatter", 
            mode = "markers",
            text = ~cat,
            marker = list(size = 10),
            source = "A")
    
    
  })
  
  p1 <- reactive({
    
    event_data("plotly_click", source = "A")
    
  })
  
  p2 <- reactiveValues(points = c())
  
  observeEvent(p1(),{
    
    p2$points <- c(p2$points,as.list(p1())$pointNumber)
    
  })
  
  observeEvent(input$reset,{
    
    p2$points <- c()
    
  })
  
  output$selection <- renderPrint({ if(length(p2$points+1)<1){"Select data points to delete"}else{(p2$points+1)} })
  
  
  observeEvent(input$delete,{
    # browser()
    myData$df <- myData$df %>%
      mutate(delete = ifelse(row_number() %in% c(p2$points+1),TRUE,delete)) %>%
      filter(!delete)
    
    # And clear input?
    p2$points <- c()
  })
  
  
}

shinyApp(ui, server)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM