我正在尝试制作一个闪亮的应用程序,允许用户为散点图的x轴和y轴选择一个组(cut
)和一个变量(即depth
,table
或price
)。下面的UI代码可以很好地允许用户进行选择,但是,我在服务器上遇到了麻烦。我认为问题在于将UI选择过滤为两个数据框,然后使用rbind()
合并它们,但我不知道其他方法。
如何使ggplot()
响应用户对x和y轴的两个选择?
范例:
library(shiny)
library(tidyverse)
dat <- diamonds %>%
select(cut,depth,table,price) %>%
pivot_longer(cols = c('depth','table','price'),
names_to = 'Variable',
values_to = 'Value')
ui <- fluidPage(
selectInput("x_cut", "X-axis Cut", choices = unique(dat$cut)),
selectInput("x_variable", "X-axis Variable", choices = unique(dat$Variable)),
selectInput("y_cut", "Y-axis Cut", choices = unique(dat$cut)),
selectInput("y_variable", "Y-axis Variable", choices = unique(dat$Variable)),
plotOutput("plot")
)
server <- function(input, output) {
output$plot <- renderPlot({
filtered_xdat <- dat %>%
filter(cut == input$x_cut, Variable == input$x_variable)
filtered_ydat <- dat %>%
filter(cut == input$y_cut, Variable == input$y_variable)
filtered_dat <- rbind(filtered_xdat, filtered_ydat)
filtered_dat %>%
ggplot() +
geom_point(aes(x = input$x_variable,
y = input$y_variable)) +
geom_point()
})
}
shinyApp(ui, server)
# Warning: Error in geom_point: Problem while setting up geom.
# ℹ Error occurred in the 2nd layer.
# Caused by error in `compute_geom_1()`:
# ! `geom_point()` requires the following missing aesthetics: x and y
我试过这个:
server <- function(input, output) {
output$plot <- renderPlot({
filtered_xdat <- dat %>%
filter(cut == input$x_cut,
xVariable == input$x_variable) %>%
as.data.frame()
filtered_ydat <- dat %>%
filter(cut == input$y_cut,
yVariable == input$y_variable) %>%
as.data.frame()
ggplot() +
geom_point(aes(x = filtered_xdat$xVariable, y = filtered_ydat$yVariable)) +
theme_minimal()
})
}
# Warning: Error in filter: ℹ In argument: `xVariable == input$x_variable`.
# Caused by error:
# ! object 'xVariable' not found
还有这个
server <- function(input, output) {
output$plot <- renderPlot({
filtered_dat <- dat %>%
filter(cut %in% c(input$x_cut, input$y_cut),
Variable %in% c(input$x_variable, input$y_variable))
ggplot(data = filtered_dat, aes(x = !!sym(input$x_variable), y = !!sym(input$y_variable))) +
geom_point() +
theme_minimal()
})
}
# Warning: Error in geom_point: Problem while computing aesthetics.
# ℹ Error occurred in the 1st layer.
# Caused by error in `FUN()`:
# ! object 'depth' not found
1条答案
按热度按时间u0sqgete1#
rbind
可能不是最好的选择。虽然cbind
应该正常工作,但在您的示例中,x和y变量之间没有关系。所以,我只是cbind一个新的函数cbindPad
,允许不同的行数。在您的真实的用例中,您可能只需要使用cbind
。试试这个