R闪亮拉丝点表空白NA行

时间:2019-01-14 23:48:30

标签: r shiny

我正在开发一个shiny应用程序,在该应用程序中,我允许用户选择绘图标准,然后还允许他们画笔绘图并在下表中查看他们的选择。我的数据中有一些NA值。我注意到这些NAs最终以NA的完整行出现在我的刷点表中。我可以使用something like this手动删除它们。但是,我想知道我是否在刷头上做错了什么导致了这种情况。

下面是带有工作示例的代码。我还包括一张笔刷选择的图像,演示了我的意思。

library(shiny)
library(tidyverse)

# replace some random values in mtcars with NA
set.seed(1)
mtnew <-
  as.data.frame(lapply(mtcars, function(m)
    m[sample(
      c(TRUE, NA),
      prob = c(0.8, 0.2),
      size = length(m),
      replace = TRUE
    )]))


# set up UI that allows user to pick x and y variables, see a plot, 
#  brush the plot, and see a table based on the brush
ui <- fluidPage(

  titlePanel("Shiny Test"),

  sidebarLayout(

    sidebarPanel(
      selectInput("xvar", 
                  "pick x", 
                  choices = names(mtnew)),
      selectInput("yvar", 
                  "pick y", 
                  choices = names(mtnew))),

    mainPanel(
      plotOutput("myplot", 
                 brush = brushOpts(id = "plot_brush")),
      tableOutput("mytable")
    )
  )
)


server <- function(input, output) {
  output$myplot <- renderPlot({
    ggplot(data = mtnew) + 
      geom_point(aes(x = !!rlang::sym(input$xvar), 
                     y = !!rlang::sym(input$yvar)))
  })

  output$mytable <- renderTable({
    brush_out <- brushedPoints(mtnew, input$plot_brush)
  })
}

# Complete app with UI and server components
shinyApp(ui, server)

enter image description here

1 个答案:

答案 0 :(得分:0)

我想您必须确定要表示的数据。

您可能只希望定义记录而没有NA,在这种情况下,我建议使用complete.cases函数。但是,此解决方案将大大减少您的数据集(在我下面已将其应用于您的代码)。

另一个选择是保留所有记录,但不保留NA。在这种情况下,您应该考虑使用imputation methods来设置适当的替换值。看一下this post,它提供了一个示例。

library(shiny)
library(tidyverse)

# replace some random values in mtcars with NA
set.seed(1)
mtnew <-
  as.data.frame(lapply(mtcars, function(m)
    m[sample(
      c(TRUE, NA),
      prob = c(0.8, 0.2),
      size = length(m),
      replace = TRUE
    )]))

mtnew_complete <- mtnew[complete.cases(mtnew),] 

# set up UI that allows user to pick x and y variables, see a plot, 
#  brush the plot, and see a table based on the brush
ui <- fluidPage(

  titlePanel("Shiny Test"),

  sidebarLayout(

    sidebarPanel(
      selectInput("xvar", 
                  "pick x", 
                  choices = names(mtnew)),
      selectInput("yvar", 
                  "pick y", 
                  choices = names(mtnew))),

    mainPanel(
      plotOutput("myplot", 
                 brush = brushOpts(id = "plot_brush")),
      tableOutput("mytable")
    )
  )
)


server <- function(input, output) {
  output$myplot <- renderPlot({
    #ggplot(data = mtnew) + 
    ggplot(data = mtnew_complete) + 
      geom_point(aes(x = !!rlang::sym(input$xvar), 
                     y = !!rlang::sym(input$yvar)))
  })

  output$mytable <- renderTable({
    #brush_out <- brushedPoints(mtnew, input$plot_brush)
    brush_out <- brushedPoints(mtnew_complete, input$plot_brush)
  })
}

# Complete app with UI and server components
shinyApp(ui, server)