Subset a reactive dataframe in R SHINY

Hello I want to find the correlation coefficient of two columns of my dataset. If I use cor(subset(iris, select=c("Sepal.Length")),subset(iris, select=c("Sepal.Width")))

the correlation is being found but I cannot subset with my actual dataset which comes as a CSV file input and is in a reactive expression.

cor(subset(rt(), select=c("Sepal.Length")),subset(rt(), select=c("Sepal.Width")))
So how could I subset a data frame of this reactive form?

rt<-reactive({
    req(input$file1)

    csvdata <- read.csv(input$file1$datapath,
                        header = input$header
    )
csvdata

})

I put my whole code if that helps understand the question

#ui.r
library(shiny)
library(ggplot2)
library(plotly)
library(extrafont)

fluidPage(

  # App title ----
  titlePanel(div("CROSS CORRELATION",style = "color:blue")),

  # Sidebar layout with input and output definitions ----
  sidebarLayout(

    # Sidebar panel for inputs ----
    sidebarPanel(

      # Input: Select a file ----
      fileInput("file1", "Input CSV-File",
                multiple = TRUE,
                accept = c("text/csv",
                           "text/comma-separated-values,text/plain",
                           ".csv")),

      # Horizontal line ----
      tags$hr(),

      # Input: Checkbox if file has header ----
      checkboxInput("header", "Header", TRUE),

      # Input: Select separator ----
      radioButtons("sep", "Separator",
                   choices = c(Comma = ",",
                               Semicolon = ";",
                               Tab = "\t"),
                   selected = ","),


      # Horizontal line ----
      tags$hr(),

      # Input: Select number of rows to display ----
      radioButtons("disp", "Display",
                   choices = c(Head = "head",
                               All = "all"),
                   selected = "head")





    ),
    # Main panel for displaying outputs ----
    mainPanel(

      tabsetPanel(type = "tabs",
                  tabPanel("Table",
                           shiny::dataTableOutput("contents")),
                  tabPanel("Correlation Plot",
                           fluidRow(
                             column(3, uiOutput("lx1")),
                           column(3,uiOutput("lx2"))),
                           hr(),
                           fluidRow(
                             tags$style(type="text/css",
                                        ".shiny-output-error { visibility: hidden; }",
                                        ".shiny-output-error:before { visibility: hidden; }"
                             ),
                           column(3,uiOutput("td")),
                           column(3,uiOutput("an"))),
                           plotlyOutput("sc"))
      ))
  ))
#server.r
function(input, output) {
  rt<-reactive({
    req(input$file1)

    csvdata <- read.csv(input$file1$datapath,
                        header = input$header
    )


    csvdata
  }) 

  output$contents <- shiny::renderDataTable({

    rt()
  })


  output$lx1<-renderUI({
    selectInput("lx1", label = h4("Select 1st Expression Profile"), 
                choices = colnames(rt()[,4:15]), 
                selected = "Lex1")
  })
  output$lx2<-renderUI({
    selectInput("lx2", label = h4("Select 2nd Expression Profile"), 
                choices = colnames(rt()[,4:15]), 
                selected = "Lex2")
  })

  output$td<-renderUI({
    radioButtons("td", label = h3("Trendline"),
                 choices = list("Add Trendline" = "lm", "Remove Trendline" = ""), 
                 selected = "")
  })

  output$an<-renderUI({

    radioButtons("an", label = h3("Correlation Coefficient"),
                 choices = list("Add R^2" = cor(subset(rt(), select=c(input$lx1)),subset(rt(), select=c(input$lx2))), "Remove R^2" = ""), 
                 selected = "")
  })   


 output$sc<-renderPlotly({

   p1 <- ggplot(rt(), aes_string(x = input$lx1, y = input$lx2))+
     # Change the point options in geom_point
     geom_point(color = "darkblue") +
     # Change the title of the plot (can change axis titles
     # in this option as well and add subtitle)
     labs(title = "Cross Correlation") +
     # Change where the tick marks are
     scale_x_continuous(breaks = seq(0, 80000, 10000)) +
     scale_y_continuous(breaks = seq(0, 120000, 20000)) +
     # Change how the text looks for each element
     theme(title = element_text(family = "Calibri", 
                                size = 10, 
                                face = "bold"), 
           axis.title = element_text(family = "Calibri Light", 
                                     size = 16, 
                                     face = "bold", 
                                     color = "darkgrey"), 
           axis.text = element_text(family = "Calibri", 
                                    size = 11))+
     theme_bw()+
     geom_smooth(method = input$td)+
     annotate("text", x = 50000, y = 50000, label = as.character(input$an))
   ggplotly(p1) %>%
     layout(hoverlabel = list(bgcolor = "white", 
                              font = list(family = "Calibri", 
                                          size = 9, 
                                          color = "black")))

 }) 

}

if you want to subset based on the Display radiobutton, you can do something like this

  rt<-reactive({
    req(input$file1) 
    csvdata <- read.csv(input$file1$datapath, header = input$header)
    if(input$disp == "head"){
      head(csvdata)
    } else{
      csvdata
    }  
  })

useful but I want to subset based on this radiobutton

output$an<-renderUI({

    radioButtons("an", label = h3("Correlation Coefficient"),
                 choices = list("Add R^2" = cor(subset(rt(), select=c(input$lx1)),subset(rt(), select=c(input$lx2))), "Remove R^2" = ""), 
                 selected = "")
  })

hi @makis23, it's not totally clear to me what you want to achieve with this correlation coefficient radioButton. Can you explain?
The problem might be in the choices argument. Values in this list should be strings, see documentation of radiobuttons (?radiobuttons)

1 Like

It was a missing value problem, otherwise the code works fine but thanks.