В вашем коде было несколько проблем: input$xcol
и input$ycol
содержат значения символов, поэтому вы должны использовать aes_string
в функции ggplot
.Кроме того, вам нужно было получить свои tabsetPanel
и sidebarLayout
прямо (незначительная проблема).
Кроме этого, в вашем data
реактиве вы используете входные данные для sep
и quote
, которые не найдены в вашем пользовательском интерфейсе, что вызывает ошибку.Если я их закомментирую, все работает как положено.Для тестирования я использовал write.csv(diamonds, file = "diamonds.csv")
:
library(shiny)
library(ggplot2)
shinyApp(
ui = fluidPage(
tabsetPanel(
tabPanel(
"Upload File",
titlePanel("Uploading Files"),
fileInput(
inputId = "file1",
label = "Choose CSV File",
multiple = FALSE,
accept = c("text/csv", "text/comma-separated-values, text/plain", ".csv")
)),
tabPanel(
"Plot",
pageWithSidebar(
headerPanel("Plot your data"),
sidebarPanel(
selectInput("xcol", "X Variable", ""),
selectInput("ycol", "Y Variable", "", selected = "")
),
mainPanel(plotOutput("MyPlot"))
)
)))
,
server <- function(input, output, session) {
# added "session" because updateSelectInput requires it
data <- reactive({
req(input$file1) # require that the input is available
df <- read.csv(input$file1$datapath)#,
# no such inputs in your UI
# header = input$header,
# sep = input$sep,
# quote = input$quote
# )
updateSelectInput(session,
inputId = "xcol", label = "X Variable",
choices = names(df), selected = names(df)[sapply(df, is.numeric)]
)
updateSelectInput(session,
inputId = "ycol", label = "Y Variable",
choices = names(df), selected = names(df)[sapply(df, is.numeric)]
)
return(df)
})
output$contents <- renderTable({
data()
})
output$MyPlot <- renderPlot({
x <- data()[, c(input$xcol, input$ycol)]
p <- ggplot(x, aes_string(input$xcol, input$ycol))
p <- p + geom_line() #+ geom_point()
print(p)
# plot(mydata, type = "l",
# xlab = input$xcol,
# ylab = input$ycol)
})
# Generate a summary table of the data uploaded
output$summary <- renderPrint({
y <- data()
summary(y)
})
}
)