Roelof Coertze
Roelof Coertze

Reputation: 586

Passing variable in function to other function variables in R

I am trying to pass a variable Phyla (which is also the name of a df column of interest) into other functions. However I get the error: Error: Columntax_levelis unknown. Which I understand. It would just be more convenient to state the column you want to use once in the function since this will also be repeated numerous times in the script. I Have tried using OTU_melt_grouped[,1] since this will always be the first column to use in the dcast function, but get the error: Error: Must use a vector in[, not an object of class matrix. Moreover, it does not solve my solution in the group_by function since I want to be able to specify Phyla, Class, Order etc...

I am sure there must be a simple solution, but I don't know where to start!

taxa_specific_columns_func <- function(data, tax_level = Phyla) {

  OTU_melt_grouped <- data %>% 
    group_by(tax_level, variable) %>% 
    summarise(value = sum(value))

  taxa_cols <- dcast(OTU_melt_grouped, variable ~ tax_level)
  rownames(taxa_cols) <- meta_data$site
  taxa_cols <- taxa_cols[-1]

  return(taxa_cols)
}


tax_test <- taxa_specific_columns_func(OTU_melt)

Upvotes: 1

Views: 186

Answers (1)

akrun
akrun

Reputation: 886938

As we are passing an unquoted variable, we could make use of curly-curly ({{..}}) operator in group_by

library(dplyr)
library(tidyr)
library(tibble)
taxa_specific_columns_func <- function(data, tax_level = Phyla) {
 data %>% 
         group_by({{tax_level}}, variable) %>% 
         summarise(value = sum(value)) %>%
         pivot_wider(names_from = {{tax_level}}, values_from = value) %>%
         column_to_rownames("variable")

}

taxa_specific_columns_func(OTU_melt)
#         A          B         C          D          E
#a  0.01859254 0.42141238 -0.196961 -0.1859115 -0.2901680
#b -0.64700080         NA -0.161108         NA         NA
#c -0.03297331 0.05871052 -1.963341         NA  0.7608218

data

set.seed(48)
OTU_melt <- data.frame(Phyla = rep(LETTERS[1:5], each = 3), 
      variable = sample(letters[1:3], 15, replace = TRUE), value = rnorm(15))

Upvotes: 2

Related Questions