我正在尝试制作一个闪亮的应用程序,允许用户为散点图的 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
rbind
可能不是这里的最佳选择。虽然cbind
应该正常工作,但在您的示例中,x 和 y 变量之间没有关系。因此,我只是使用一个新函数进行 cbindcbindPad
,允许不同的行数。在您的实际用例中,您可能只需要使用cbind
. 尝试这个