{{ env_id }} <- readRDS(file.path(datadir, "{{ env_id }}.rds")) is_shiny <- identical(knitr::opts_knit$get("rmarkdown.runtime"), "shiny") library(magrittr)
# selecting the first numeric and factor column for object wrapper {{ env_id }}$y %>% as.data.frame() %>% dplyr::select_if(function(col) is.integer(col) | is.numeric(col)) %>% dplyr::select(1) -> y_{{ env_id }} if(!is.null({{ env_id }}$group_by)){ {{ env_id }}$group_by %>% as.data.frame() %>% dplyr::select_if(is.factor) %>% dplyr::select(1) -> group_by_{{ env_id }} group_by_title_{{ env_id }} <- colnames(group_by_{{ env_id }}) } else { group_by_title_{{ env_id }} <- NULL group_by_{{ env_id }} <- NULL } # compare with colormaps if(!is.null(group_by_title_{{ env_id }})){ if(group_by_title_{{ env_id }} %in% names(colormaps)) colors_{{ env_id }} <- colormaps[[group_by_title_{{ env_id }}]] else colors_{{ env_id }} <- "Set1" } else { colors_{{ env_id }} <- "Set1" } # set title variables if(!is.null({{ env_id }}$y_title)) y_title_{{ env_id }} <- {{ env_id }}$y_title else y_title_{{ env_id }} <- colnames(y_{{ env_id }}) if(!is.null({{ env_id }}$group_by_title)) group_by_title_{{ env_id }} <- {{ env_id }}$group_by_title # creating the plot object plot_{{ env_id }} <- i2dash.scrnaseq::plotly_violinplot(y = y_{{ env_id }}[,1], group_by = group_by_{{ env_id }}[,1], y_title = y_title_{{ env_id }}, group_by_title = group_by_title_{{ env_id }}, colors = colors_{{ env_id }}) # Provide data for download if(!is.null({{ env_id }}$group_by)) download_df_{{ env_id }} <- data.frame(y_{{ env_id }}, group_by_{{ env_id }}) else download_df_{{ env_id }} <- data.frame(y_{{ env_id }}) rownames(download_df_{{ env_id }}) <- rownames({{ env_id }}$y) htmltools::div(style="display:block;float:left;width:100%;height:90%;", htmltools::tags$button(i2dash::embed_var(download_df_{{ env_id }})), plot_{{ env_id }} )
ui_list <- list() # # shiny input widget for y # if ({{ env_id }}$y_selection){ ui_list <- rlist::list.append(ui_list, selectInput("select_y_{{ env_id }}", label = "Select observations:", choices = colnames({{ env_id }}$y[lapply({{ env_id }}$y,class) =="numeric" | lapply({{ env_id }}$y,class) =="integer"]))) } # # shiny input widget for group_by # if ({{ env_id }}$group_by_selection){ ui_list <- rlist::list.append(ui_list, selectInput("select_group_by_{{ env_id }}", label = "Group observations by:", choices = colnames({{ env_id }}$group_by[lapply({{ env_id }}$group_by,class) =="factor"]))) } # # shiny download button # ui_list <- rlist::list.append(ui_list, tags$div(tags$br(), downloadButton('downloadData_{{ env_id }}', 'Download data'))) # # Handle inputs # if( !{{ env_id }}$y_selection){ y_{{ env_id }} <- shiny::reactive({ data <- {{ env_id }}$y[[1]] title <- colnames({{ env_id }}$y)[1] return(list(data = data, title = title)) }) } else { y_{{ env_id }} <- shiny::reactive({ data <- {{ env_id }}$y[[input$select_y_{{ env_id }}]] title <- input$select_y_{{ env_id }} return(list(data = data, title = title)) }) } if( !{{ env_id }}$group_by_selection ) { group_by_{{ env_id }} <- shiny::reactive({ data <- {{ env_id }}$group_by[[1]] title <- colnames({{ env_id }}$group_by)[1] return(list(data = data, title = title)) }) } else { group_by_{{ env_id }} <- shiny::reactive({ data <- {{ env_id }}$group_by[[input$select_group_by_{{ env_id }}]] title <- input$select_group_by_{{ env_id }} return(list(data = data, title = title)) }) } # # Download data.frame # output$downloadData_{{ env_id }} <- downloadHandler( filename = paste('data-', Sys.Date(), '.csv', sep=''), content = function(file) { if(is.null({{ env_id }}$group_by)){ df <- y_{{ env_id }}()$data } else { df <- data.frame(y_{{ env_id }}()$data, group_by_{{ env_id }}()$data) } rownames(df) <- rownames({{ env_id }}$y) write.csv(df, file) } ) # # reactive for plot creation # output$plot_{{ env_id }} <- plotly::renderPlotly({ # compare with colormaps if(!is.null(group_by_{{ env_id }}()$title)){ if(group_by_{{ env_id }}()$title %in% names(colormaps)) colors <- colormaps[[group_by_{{ env_id }}()$title]] else colors <- "Set1" } else { colors <- "Set1" } # set custom axis titles if provided if(!is.null({{ env_id }}$y_title)) y_title <- {{ env_id }}$y_title else y_title <- y_{{ env_id }}()$title if(!is.null({{ env_id }}$group_by_title)) group_by_title <- {{ env_id }}$group_by_title else group_by_title <- group_by_{{ env_id }}()$title # # Handle eventdata # eventdata <- plotly::event_data("plotly_selected", source = {{ env_id }}$transmitter) if(!is.null(eventdata)){ keys <- rownames({{ env_id }}$y) indexes <- which(keys %in% eventdata$key) y <- y_{{ env_id }}()$data[indexes] if(!is.null(group_by_{{ env_id }}())) group_by <- group_by_{{ env_id }}()$data[indexes] } else { y <- y_{{ env_id }}()$data group_by <- group_by_{{ env_id }}()$data } i2dash.scrnaseq::plotly_violinplot(y = y, group_by = group_by, y_title = y_title, group_by_title = group_by_title, colors = colors) }) # # Layout of component # shiny::fillRow(flex = c(NA, 1), shinyWidgets::dropdownButton(div(style='max-height: 350px; overflow-x: auto;',do.call(shiny::inputPanel, ui_list)), circle = TRUE, status = "danger", icon = icon("gear"), width = "300px", tooltip = shinyWidgets::tooltipOptions(title = "Click, to change plot settings:")), plotly::plotlyOutput("plot_{{ env_id }}", height = "100%") )
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.