如何在闪亮的应用程序上选择数据集?

时间:2018-01-10 20:22:22

标签: r ggplot2 shiny reactive

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

我试图制作一个根据用户选择的数据集制作情节的闪亮应用。

但是我一直收到以下错误: -

  

ggplot2不知道如何处理类字符数据

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

当我在其上运行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)

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

首先,browser.DialogHandler = new TempFileDialogHandler(); 返回一个字符串。它不返回与该字符串的值具有相同名称的data.frame。如果您将data.frame作为字符串传递,则input$data不起作用:

ggplot()

也许尝试使用

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

使用base <- reactive ({get(input$data) }) 来获取具有字符串版本名称的对象。

但即便如此get()也不会起作用。绘图时,应首先将data.frame保存到变量中。此外,在base[[1]]中重复数据值并不是一个好主意 - 这实际上是映射列而不是值。更好的方法是使用aes()和列的名称。例如

aes_string()

这是有效的,因为它们是相同的

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