Я пытаюсь выполнить рендеринг, используя 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()
})