如何在 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"
这是我的第一个问题,因为我正在努力学习编程...
我正在尝试制作一个闪亮的应用程序,根据用户选择的数据集绘制图表。
但我不断收到以下错误:-
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"