【问题标题】:通过在闪亮的应用程序中单击来排除数据点
【发布时间】:2022-01-23 07:02:57
【问题描述】:

我想排除用户通过单击选择的某些数据点,例如 this 示例(但使用绘图)。 我尝试使用下面显示的代码来执行此操作,但它不起作用。

我想做的是确定数据点的位置,然后一旦我得到位置,如果row_number() 在一组选定的数据点中,则将 var delete 设置为 TRUE 并且那么过滤器就是delete就是TRUE

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

如果有任何帮助或指导,我将不胜感激。

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)

【问题讨论】:

    标签: r plot shiny plotly


    【解决方案1】:

    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)
    

    【讨论】:

      猜你喜欢
      • 2017-07-10
      • 2014-04-11
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 2018-02-16
      • 2016-07-08
      • 1970-01-01
      • 2013-07-08
      相关资源
      最近更新 更多