Использование Reactive Dataset для GGplot2? - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь выполнить рендеринг, используя ggplot2 вместо функции plot базового R.

Однако я столкнулся с некоторыми проблемами при использовании реактивного набора данных в ggplot2.

Ниже приведен код, который работает с графиком базового R:

library(shiny)
library(ggplot2)

# Define UI for application that draws a histogram
ui <- fluidPage(

  # Application title
  titlePanel("Javier Test"),

  # Sidebar with a slider input for number of bins 
  sidebarLayout(
    sidebarPanel(

      # Input: Select a file ----
      fileInput('file1', 'Choose CSV File',
                accept=c('text/csv', 
                         'text/comma-separated-values,text/plain', 
                         '.csv')),

      # Horizontal line ----
      tags$hr(),

      checkboxInput('header', 'Header', TRUE),
      radioButtons('sep', 'Separator',
                   c(Comma=',',
                     Semicolon=';',
                     Tab='\t'),
                   ','),
      radioButtons('quote', 'Quote',
                   c(None='',
                     'Double Quote'='"',
                     'Single Quote'="'"),
                   '"'),

      #implementing dropdown column 
      selectInput('xcol', 'X Variable', ""),
      selectInput('ycol', 'Y Variable', "", selected = "")),

    # Show a plot of the generated distribution
    mainPanel(
      # Output: Data file ----
      plotOutput('MyPlot')
    )
  )
)

# Define server logic required to draw a histogram
server <- shinyServer(function(input, output, session) {
  # added "session" because updateSelectInput requires it


  data <- reactive({ 
    req(input$file1) ## ?req #  require that the input is available

    inFile <- input$file1 

    # tested with a following dataset: write.csv(mtcars, "mtcars.csv")
    # and                              write.csv(iris, "iris.csv")
    df <- read.csv(inFile$datapath, header = input$header, sep = input$sep,
                   quote = input$quote)


    # Update inputs (you could create an observer with both updateSel...)
    # You can also constraint your choices. If you wanted select only numeric
    # variables you could set "choices = sapply(df, is.numeric)"
    # It depends on what do you want to do later on.

    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)[2])

    return(df)
  })

  output$MyPlot <- renderPlot({
    x <- data()[,c(input$xcol, input$ycol)]
    plot(x)
  })
})

shinyApp(ui, server)

Это часть, в которой я вместо этого пытаюсь перейти к графику рендеринга ggplot2:

  output$MyPlot <- renderPlot({
    ggplot(data, aes(x=input$xcol, y=input$ycol)) + geom_point()
  })

Ошибка: ggplot2 не знает, как обращаться с данными класса реактивныйExpr / реактивный

Есть идеи, как использовать реактивный набор данных для ggplot2?

Большое спасибо!

Обновление

Вот код!Я понял это.Не очень приятно, есть ли лучший способ представить это?

  output$MyPlot <- renderPlot({
    x <- data()[,c(input$xcol, input$ycol)]
    ggplot(x, aes(x=x[,1], y=x[,2])) + geom_point()
  })

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Вместо того, чтобы вводить данные несколько раз в функцию renderPlot, вместо функции aes можно использовать функцию aes_string из пакета ggplot.Таким образом, решение с одним вкладышем будет:

output$MyPlot <- renderPlot({
ggplot(data = data(), aes_string(x = input$xcol, y = input$ycol)) + geom_point()
})
0 голосов
/ 20 сентября 2018

Теперь работает хорошо:

  output$MyPlot <- renderPlot({
       x <- data()[,c(input$xcol, input$ycol)]

        ggplot(x, aes(x=data()[,c(input$xcol)], 
                      y=data()[,c(input$ycol)])) + geom_point()

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