Использование фильтра в plotOutput для динамических пользовательских данных в приложении Shiny - PullRequest
0 голосов
/ 07 октября 2019

У меня проблемы с фильтрацией данных для визуализации ggplot2. Я хочу использовать фильтр и ввести значение f, например, используя

data %>%
filter(Col == Number) 
ggplot() 

, чтобы получить настраиваемый график в соответствии с наборами данных

Я использовал этот код для создания блестящего приложения, которое позволит пользователюзагрузить данные и может в интерактивном режиме построить их, но фильтр не работает.
:

library(shiny)
library(tidyverse)


ui <- shinyUI(
  fluidPage(
    h1(' output'),
    h2('Graphics'),
    sidebarLayout(
      sidebarPanel(
        fileInput(inputId = 'file1', label = 'Upload your Data:', accept=c('text/csv', 
                                                                           'text/comma-separated-values,text/plain', 
                                                                           '.csv')),
        tags$hr(), 

        selectInput('xcol', "X variable:", "", selected = ""),
        selectInput('ycol', 'Y variable:', "", selected = ""), 
        selectInput('filter1', 'Filter:', "", selected = "", multiple = TRUE),
        selectInput('filter2', 'Filter Value',"",selected = "")
      ),

      mainPanel(

        plotOutput("plot")

      )
    )

  )

)

server <- shinyServer(function(session, input, output){


   data <- reactive({

       req(input$file1)
       inFile <- input$file1 
       df <- read_csv(inFile$datapath)#, header = T, sep=",")



       updateSelectInput(session, inputId = 'xcol', label = 'X variable:',
                         choices = names(df), selected = names(df))
       updateSelectInput(session, inputId = 'ycol', label = 'Y variable:',
                        choices = names(df), selected = names(df))
       updateSelectInput(session, inputId = 'filter1', label = 'Filter:',
                         choices = names(df), selected ="")
       observe({
       updateSelectInput(session, inputId = 'filter2', label = 'Filter value', choices =c(0:10))
       })  
       return(df)

   }) 

   output$plot <- renderPlot({
     F1 <- input$filter1
     F2 <- input$filter2

       data() %>% filter(F1==F2)%>% 
       ggplot(aes(x =data()[input$xcol],y= data()[input$ycol]))+ 
       geom_point()

})
        })




shinyApp(ui = ui, server = server) 

Большое вам спасибо

1 Ответ

0 голосов
/ 07 октября 2019

Лично я бы не делал поднаборов в вызове ggplot(). Вам также не нужно (и фактически не следует) указывать data() в вызове ggplot(). Вот как я мог бы это сделать (хотя трудно проверить, если вы не предоставляете воспроизводимые данные):

x_var <- reactive(input$xcol)
y_var <- reactive(input$ycol)

data() %>%
    filter(F1 == F2) %>%
    ggplot(aes_string(x = x_var(), y = y_var())) +
    geom_point()

Еще в моем последнем замечании рассмотрим разницу между следующим:

mtcars %>% filter(carb == 2) %>% ggplot(aes(x = carb, y = wt)) + geom_point()
# this works!
mtcars %>% filter(carb == 2) %>% ggplot(aes(x = mtcars$carb, y = mtcars$wt)) + geom_point()
# this doesn't

Последний не работает, потому что пытается построить mtcars$carb вместо отфильтрованного (mtcars == 2) вектора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...