R Shiny actionButton修剪数据限制

时间:2017-12-05 05:55:53

标签: r shiny trim

我正在编写一个R Shiny脚本,通过单击图表来删除不良数据点。流程如下:

目标#1:用户点击actionButton"删除",然后点击图表上的一个点。这一点是ymin,R删除任何小于该值的y值。 "删除" =声明为NA。

目标#2:相反,用户点击actionButton"删除上方",然后点击图表上的一个点。该点是ymax,R除去任何大于该值的y值。

以下是代码的简化版本:

library(shiny)
x = seq(0,10,length=50)
y = sin(x)
picked.style = "color: white; background-color: black"

ui = fluidPage(
  plotOutput("y.trimmed", click = "plot_click"),
  actionButton(inputId="b.above.pushed", label="Delete Above"),
  actionButton(inputId="b.below.pushed", label="Delete Below")
)

server = function(input, output) {
  v <- reactiveValues(
    ymin = min( y, na.rm=T),
    ymax = max(y, na.rm=T),
    pick.bottun = "none"
  )

  ############ push a button  
  # pick above
  observeEvent(input$b.above.pushed, {
    v$pick.bottun <- "above"
    observeEvent(input$plot_click, 
    {v$ymax = input$plot_click$y}, ignoreInit = TRUE)
  })
  # pick below
  observeEvent(input$b.below.pushed, {
    v$pick.bottun <- "below"
    observeEvent(input$plot_click, 
    { v$ymin <- input$plot_click$y}, ignoreInit = TRUE)
  })

  ############# update and replot data
  output$y.trimmed <- renderPlot({
    # clean data
    print(paste("ymin=",round(v$ymin), "ymax=",round(v$ymax)) )
    cc = y <= v$ymin & is.na(y)==F; y[cc] = NA
    cc = y >= v$ymax & is.na(y)==F; y[cc] = NA
    plot(x, y)
  })
}

shinyApp(ui, server)

到目前为止,对于目标#1,它可以正常运行(即使你多次运行它)。同样,它适用于Objective#2。

如果要声明ymin然后声明ymax,则会出现问题。它会声明一个min就好了(假设让ymin = 0.1),但是为什么你要声明ymax(假设ymax = 0.5),它设置为ymin和ymax等于0.5。然后删除所有数据,导致代码崩溃。如果先声明ymax然后尝试设置ymin,则会发生同样的事情。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

你不想把observeEvent放在另一个。最好总是将它们放在服务器功能中,并让它们根据所选择的值做出反应。像这样。

library(shiny)
x = seq(0,10,length=50)
y = sin(x)
picked.style = "color: white; background-color: black"

ui = fluidPage(
  plotOutput("y.trimmed", click = "plot_click"),
  actionButton(inputId="b.above.pushed", label="Delete Above"),
  actionButton(inputId="b.below.pushed", label="Delete Below")
)

server = function(input, output) {
  v <- reactiveValues(
    ymin = min( y, na.rm=T),
    ymax = max(y, na.rm=T),
    pick.bottun = "none"
  )

  ############ push a button  
  # pick above
  observeEvent(input$b.above.pushed, {
    v$pick.bottun <- "above"
  })

  observeEvent(input$plot_click, 
               {
                 if(v$pick.bottun == "above"){
                    v$ymax = input$plot_click$y
                 } else if(v$pick.bottun == "below"){
                   v$ymin = input$plot_click$y
                 }

               }, ignoreInit = TRUE)
  # pick below
  observeEvent(input$b.below.pushed, {
    v$pick.bottun <- "below"
  })

  ############# update and replot data
  output$y.trimmed <- renderPlot({
    # clean data
    print(paste("ymin=",round(v$ymin), "ymax=",round(v$ymax)) )
    cc = y <= v$ymin & is.na(y)==F; y[cc] = NA
    cc = y >= v$ymax & is.na(y)==F; y[cc] = NA
    plot(x, y)
  })
}

shinyApp(ui, server)

希望这有帮助!