如何在 shiny app 上 select 一个数据集?

How to select a data set on shiny app?

这是我的第一个问题,因为我正在努力学习编程...

我正在尝试制作一个闪亮的应用程序,根据用户选择的数据集绘制图表。

但我不断收到以下错误:-

ggplot2 doesn't know how to deal with data of class character

即使我将两个轴都指定为数字。

当我 运行 自己编写 ggplot 代码时,它使绘图没有问题,所以我认为问题出在调用数据集上。

我正在为这个问题调用基础包数据集,但我需要一个答案,它可以解决我电脑上存储的数据集的问题。

library(shiny)
ui <- fluidPage(
            sidebarLayout(
              sidebarPanel(selectInput("data", h4("select data"),
                                       choices=c("mtcars" = "mtcars",
                                                 "pressure" = "pressure"))),
            mainPanel(
               PlotOutput("graph")

              )
            ))

服务器

server <- function(input, output) {

library(ggplot2)
library(dplyr)

base <- reactive ({
base <- input$data })

output$graph <- renderPlot({

  ggplot(base(), aes(as.numeric(base[[2]]), as.numeric(base[[3]]))) + 
  geom_col()
})
}

shinyApp(ui = ui, server = server)

在此先感谢您的帮助!

首先,input$data return是一个字符串。它不会 return 与该字符串的值具有相同名称的 data.frame。如果将 data.frame 作为字符串传递,ggplot() 将不起作用:

ggplot(mtcars, aes(mpg, cyl)) + geom_point()     #OK
ggplot("mtcars", aes(mpg, cyl)) + geom_point()   # NOT OK

也许尝试使用

base <- reactive ({get(input$data) })

它使用 get() 来获取一个对象及其名称的字符串版本。

但即使这样 base[[1]] 也行不通。绘制时,应首先将 data.frame 保存到变量中。此外,在 aes() 中重复数据值也不是一个好主意——这实际上是为了映射列而不是值。最好将 aes_string() 与列名一起使用。例如

output$graph <- renderPlot({
  mydata <- base()    
  ggplot(mydata, aes_string(names(mydata)[2], names(mydata)[3])) + 
  geom_col()
})

之所以有效,是因为它们是相同的

ggplot(mtcars, aes(cyl, disp)) + geom_point()
ggplot(mtcars, aes_string("cyl", "disp")) + geom_point()
ggplot(mtcars, aes_string(names(mtcars)[2], names(mtcars)[3])) + geom_point()
# since
names(mtcars)[2]
# [1] "cyl"
names(mtcars)[3]
# [1] "disp"