问题描述
我想构建一个交互式散点图,其中可以根据数据框中的列使用选择框选择 x 和 y 轴。
这是使用 mtcars 的示例 - 我使用 colnames(mtcars) 来获取两个选择框的值。但我收到以下错误: ".subset2(x,"impl")$defineOutput 中的错误:scatter 的意外 gg 输出 Unexpected ggplot 输出的 scatter"
我做错了什么? colnames(mtcars) 有问题吗?
library(shiny)
library(shinydashboard)
library(ggplot2)
ui <- dashboardPage(
dashboardHeader(),dashboardSidebar(),dashboardBody(
fluidRow(
Box(selectInput("scat_x",label = h2("select x-axis"),choices = colnames(mtcars)),selectInput("scat_y",label = h2("select y-axis"),choices = colnames(mtcars))),Box(plotOutput("scatter",height = 250))
)
)
)
server <- function(input,output) {
output$scatter<- ggplot(mtcars,aes(x=input$scat_x,y=input$scat_y)) +
geom_point()
}
shinyApp(ui,server)
解决方法
- 要输出 ggplot,您需要将 ggplot 对象包裹在
renderPlot({})
中 - 您需要使用
aes_string
,因为您要将列名作为字符串传递给 ggplot。
library(shiny)
library(shinydashboard)
library(ggplot2)
ui <- dashboardPage(
dashboardHeader(),dashboardSidebar(),dashboardBody(
fluidRow(
box(selectInput("scat_x",label = h2("select x-axis"),choices = colnames(mtcars)),selectInput("scat_y",label = h2("select y-axis"),choices = colnames(mtcars))),box(plotOutput("scatter",height = 250))
)
)
)
server <- function(input,output) {
output$scatter<- renderPlot({
ggplot(mtcars,aes_string(x=input$scat_x,y=input$scat_y)) + geom_point()
})
}
shinyApp(ui,server)