Выбор нескольких значений пользовательского ввода в R shiny из нескольких списков, заданных как ввод - PullRequest
0 голосов
/ 06 мая 2020

У меня есть 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.

Есть идеи, есть ли способ достичь чего-то вроде этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...