Как установить подмножество данных по выбору пользователя для построения графиков в R R - PullRequest
0 голосов
/ 25 марта 2020

У меня огромное блестящее приложение, и я столкнулся с проблемой ниже. Я попытался предоставить псевдокод для этой проблемы, так как для моего опыта почти невозможно создать работающее приложение, чтобы продемонстрировать проблему. Я надеюсь, что я передал псевдо-код. Пожалуйста, помогите мне.

Вот псевдокод в файле ui.R, который имеет actionButton и radioButton с базовыми selectizeInput и checkboxGroupInput параметрами ввода и plotOutput для визуализации графика. .

###ui.R#####

tabPanel("Plots",  
     fluidRow(column(4,wellPanel(
       actionButton("action_plot","Generate Plots"),  
       h6(textOutput("numheat")),
       radioButtons("plot_subset",label="Chose by sample or group?",
                    choices=c("Sample","Group"),selected="Sample"),

       conditionalPanel("input.plot_subset=='Sample'",
                        selectizeInput("view_sample_plot",
                                       label = h5("Select Samples"),
                                       choices = NULL,
                                       multiple = TRUE,
                                       options = list(placeholder = 'select samples to plot')
                        )
       ),
       conditionalPanel("input.plot_subset=='Group'",
                        checkboxGroupInput("view_group_plot",
                                           label=h5("Select Groups to View"),
                                           choices="",
                                           selected="")
       )
     )
     ),
     column(8,
            tabsetPanel(
              tabPanel(title="Plot",
                       #textOutput("which_genes"),
                       h4(textOutput("plot_title")),
                       plotOutput("plot_rna",height="800px")
     )
     )
     )
     )
     )

Ниже приведен код псевдо-сервера. R, который отслеживает введенные пользователем значения и обновляет updateSelectizeInput и updateCheckboxGroupInput с помощью choice из загруженного по умолчанию набора данных R. Выбор пользователя selected используется в последующей функции для создания графика.

###server.R#####

## observed the user input and updated the selectize input and checkBoxGroup input values#####
observe({
  print("server-plot-update")
  # browser()
  data_analyzed = inputData()
  tmpgroups = data_analyzed$group_names
  tmpdatlong = data_analyzed$data_long
  tmpsamples = unique(tmpdatlong$sampleid)
  tmpynames = tmpdatlong$

  updateSelectizeInput(session,'view_sample_plot',
                       choices=tmpsamples, selected=NULL)
  updateCheckboxGroupInput(session,'view_group_plot',
                           choices=tmpgroups, selected=NULL)

})        

    #####code to render plot based on user selection value i.e. by group or samples######
    ##plot_render utilizes the R functions in Plot.R file to subset the data by user input and generate plot###

    plotdatReactive <- reactive({
     data_analyzed = inputData
     tmp <- plot_data(data_analyzed = data_analyzed,
                               yname="log2",
                               orderby="significance",
                               view_group=input$view_group_plot,
                               view_sample=input$view_sample_plot)
     tmp
    })


    output$plot_rna <- renderPlot({
      if(input$action_plot==0) return()   
    isolate({
      tmp = plotdatReactive()
      plot_render( data_analyzed=tmp,
                   yname = input$heatmapvaluename,
                   view_group=input$view_group_plot,
                   view_sample=input$view_sample_plot
                   )
    })  
 })

Псевдокод для функций R в plot.R file

    ####plot.R#####

    ###function to subset data based on user input samples or groups###
    plot_subdat <- function(data_analyzed,
                               yname="log2",
                               orderby="significance",
                               view_sample=NULL,
                               view_group=NULL) {

      if(is.null(view_sample)) view_sample=unique(data_analyzed$sampleid)  ## sample names in the dataset
      if(is.null(view_group)) view_group=data_analyzed$group_names ## group names in the dataset


      tmpdat = data_analyzed$data_long

      ##subset dataset by **sampleid** if the user selected **samples** in SelectizeInput
      tmpdat = tmpdat%>%filter(sampleid%in%view_sample)
      subdat = filter(data_analyzed$data_long,unique_id%in%thesegenes,sampleid%in%view_sample)


      #subset dataset by **group** if the user selected **group** in checkBoxGroup input
      tmpdat = tmpdat%>%filter(group%in%view_group)
      subdat = filter(data_analyzed$data_long,unique_id%in%thesegenes,group%in%view_group)

    }


###this function generates the plot on the subset of data from the above function#####

  plot_data <- function(...)  {
  tmpdat = plot_subdat(...)
  plotdat = tmpdat$data
  plotdat
  }

tmpdat и subdat - это входные данные для генерации графика в функции plot_render. Если пользователь выбирает и вводит значения через selectizeInput, то поднабор данных должен выполняться выборками. Если пользователь выбирает и вводит через checkBoxGroupInput, то поднабор должен выполняться по группам, как указано в коде. Я не могу подгруппировать данные на основе выбора пользователя, т.е. выборки / группы реактивно в функции plot_subdat. Как я могу сделать это так, чтобы выходной график генерировался в соответствии с выбором пользователя.

1 Ответ

0 голосов
/ 25 марта 2020

Я думаю, вам может понадобиться выражение reactive для подмножества ваших данных.

Вот базовый c рабочий пример, который включает ваши входные данные и будет отображать подмножественные данные на основе входных выборов реактивно.

Редактировать :

Фильтрация данных теперь выполняется во внешнем файле .R с input переменными для фильтрации, через которые передается.

library(shiny)

source("plot.R", local = TRUE)

ui <- fluidPage(
  mainPanel(
    tabsetPanel(
      tabPanel("Plots",  
         fluidRow(column(4,wellPanel(
           #actionButton("action_plot","Generate Plots"),  
           h6(textOutput("numheat")),
           radioButtons("plot_subset",label="Chose by sample or group?",
                        choices=c("Sample","Group"),selected="Sample"),

           conditionalPanel("input.plot_subset=='Sample'",
                            selectizeInput("view_sample_plot",
                                           label = h5("Select Samples"),
                                           choices = NULL,
                                           multiple = TRUE,
                                           options = list(placeholder = 'select samples to plot')
                            )
           ),
           conditionalPanel("input.plot_subset=='Group'",
                            checkboxGroupInput("view_group_plot",
                                               label=h5("Select Groups to View"),
                                               choices="",
                                               selected="")
           )
         )),
         column(8,
                tabsetPanel(
                  tabPanel(title="Plot",
                           #textOutput("which_genes"),
                           h4(textOutput("plot_title")),
                           plotOutput("plot_rna",height="800px")
                  )
                )
         )
        )
      )
    )
  )
)

server <- function(input, output, session) {

  observe({
    updateSelectizeInput(session,'view_sample_plot',
                           choices=unique(mtcars$gear), selected=NULL)
    updateCheckboxGroupInput(session,'view_group_plot',
                             choices=unique(mtcars$cyl), selected=NULL)
  })    

  plot_prepare <- reactive({
    if (input$plot_subset == "Sample") {
      plot_subdat(mtcars, "gear", input$view_sample_plot)
    } else {
      plot_subdat(mtcars, "cyl", input$view_group_plot)
    } 
  })

  output$plot_rna <- renderPlot({
    plot(plot_prepare())
  })

}

shinyApp(ui, server)

участок. R

# plot.R file

library(tidyverse)

plot_subdat <- function(data, variable, choices) {
  data %>%
    filter((!!sym(variable)) %in% choices) %>%
    select(c(!!sym(variable), mpg))
}
...