Estou tentando criar um aplicativo brilhante que permite ao usuário selecionar um grupo ( cut
) e uma variável (ou seja depth
,, table
ou price
) para os eixos x e y de um gráfico de dispersão. O código da UI abaixo funciona bem para permitir que o usuário faça as seleções, no entanto, estou tendo problemas com o servidor. Acho que o problema é filtrar as seleções da interface do usuário em dois quadros de dados e usá-los rbind()
para combiná-los, mas não sei outra maneira de proceder.
Como posso ggplot()
reagir às duas opções que os usuários têm para os eixos x e y?
Exemplo:
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
Eu tentei isso:
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
e isso também:
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
pode não ser a melhor opção aqui. Emboracbind
deva funcionar normalmente, no seu exemplo não há relação entre as variáveis x e y. Então, eu apenas cbind com uma nova funçãocbindPad
, permitindo um número diferente de linhas. No seu caso de uso real, talvez você precise apenas usarcbind
. Experimente isso