如何通过用户选择对数据进行子集化以在R Shiny应用程序中进行绘制

问题描述 投票:0回答:1

我有一个很棒的闪亮应用程序,遇到了以下问题。我试图提供该问题的伪代码,因为我的专业知识几乎不可能创建可运行的应用来演示该问题。我希望我已经传达了伪代码。请帮助我。

[这是ui.R文件中的伪代码,它具有actionButtonradioButton,具有基础selectizeInputcheckboxGroupInput输入选项以及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")
     )
     )
     )
     )
     )

下面是伪server.R代码,它观察用户输入值并使用默认加载的R数据集中的updateSelectizeInput更新updateCheckboxGroupInputchoice。用户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({
     tmp <- plot_data()
     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
                   )
    })  
 })

plot.R文件中R函数的伪代码

    ####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
  }

tmpdatsubdat是在plot_render函数中生成图的输入。如果用户通过selectizeInput选择并输入值,则数据的子集应通过采样完成。如果用户选择并通过checkBoxGroupInput输入,则子设置应按代码中的注释按组完成。我无法根据用户选择(即plot_subdat函数中的样本/组)对数据进行子集化。我该如何做出反应,以便根据用户选择生成输出图。

r shiny reactive
1个回答
0
投票

我认为您可能希望reactive表达式可以对数据进行子集化。

这里是一个基本的工作示例,其中包括您的输入,并将根据输入的选择来绘制子集的数据。

编辑

现在,数据过滤在一个外部.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)

plot.R

# plot.R file

library(tidyverse)

plot_subdat <- function(data, variable, choices) {
  data %>%
    filter((!!sym(variable)) %in% choices) %>%
    select(c(!!sym(variable), mpg))
}
© www.soinside.com 2019 - 2024. All rights reserved.