这是我第一个问题,因为我正在努力学习编程...
我试图制作一个根据用户选择的数据集制作情节的闪亮应用。
但是我一直收到以下错误: -
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)
提前感谢您的帮助!
答案 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()
})