У меня есть xy
координата data.frame
, которую я хотел бы изучить с помощью shiny app
. Каждая координата связана с несколькими факторами (такими как пол и возраст):
set.seed(1)
data.df <- data.frame(x = rnorm(1000), y = rnorm(1000),
sex = sample(c("F", "M"), 1000, replace = T),
age = sample(c("Y", "O"), 1000, replace = T),
group = sample(c("A", "B", "C", "D"), 1000, replace = T),
stringsAsFactors = F)
Поскольку у меня есть несколько таких наборов координатных данных, в каждом из которых набор факторов может отличаться, у меня также есть дополнительный data.frame
описание факторов и диапазон их значений L
factors.df <- data.frame(factor.name = c("sex", "age", "group"), factor.levels = NA, stringsAsFactors = F)
factors.df$factor.levels[1] <- list(c("F", "M"))
factors.df$factor.levels[2] <- list(c("Y", "O"))
factors.df$factor.levels[3] <- list(c("A", "B", "C", "D"))
В shiny app
я хотел бы разрешить подмножество data.df
с учетом факторов и связанных значений, которые выберет пользователь. Очевидно, я могу жестко запрограммировать пол, возраст и группу renderUI
вариантов выбора, например, ниже:
suppressPackageStartupMessages(library(dplyr))
suppressPackageStartupMessages(library(shiny))
server <- function(input, output)
{
output$sex.selction <- renderUI({
selectInput("sex.selction", "Select Sex", choices = unique(covariates.df$sex), multiple = T)
})
output$age.selction <- renderUI({
selectInput("age.selction", "Select Age", choices = unique(covariates.df$age), multiple = T)
})
output$group.selction <- renderUI({
selectInput("group.selction", "Select Group", choices = unique(covariates.df$group), multiple = T)
})
coordinate.plot <- reactive({
if(!is.null(input$sex.selction) & !is.null(input$age.selction) & !is.null(input$group.selction)){
plot.df <- dplyr::filter(data.df, sex %in% input$sex.selction, age %in% input$age.selction, group %in% input$group.selction)
coordinate.plot <- suppressWarnings(plotly::plot_ly(marker = list(size = 3), type = 'scatter', mode = "markers", x = plot.df$x, y = plot.df$y, showlegend = F) %>%
plotly::layout(xaxis = list(zeroline = F, showticklabels = F, showgrid = F), yaxis = list(zeroline = F, showticklabels = F, showgrid = F)))
} else{
coordinate.plot <- NULL
}
return(coordinate.plot)
})
output$outPlot <- plotly::renderPlotly({
coordinate.plot()
})
}
ui <- fluidPage(
titlePanel("Results Explorer"),
sidebarLayout(
sidebarPanel(
uiOutput("sex.selction"),
uiOutput("age.selction"),
uiOutput("group.selction")
),
mainPanel(
plotly::plotlyOutput("outPlot")
)
)
)
shinyApp(ui = ui, server = server)
Но поскольку factors.df
является переменной между наборами данных, я хотел бы иметь что-то общее c, что будет просто отображать для выбора пользователя каждую строку в factors.df
с factor.name
и factor.levels
.
Есть идеи, есть ли способ достичь чего-то вроде этого?