trying to create function which takes in quoted variables names to mutate data frame before plotting but seem I'm not doing it right when I'm extending it with purrr::map2()
the probelm seem to be coming from the dplyr::mutate case_when() because the color_codes column with Log2FC_above2 and Log2FC_below2 tags are not correct in the resulting data frame when i use map2
here's example script
#####################################################
#### create example data frame #################
#####################################################
#function to generate random numbers
random_numb_generator = function(x, numb=25){
treatment_x1 = runif(n=numb, min=-5, max=5)
treatment_x2 = runif(n=numb, min=0, max=5)
return(cbind(treatment_x1,treatment_x2))
}
n_unique_samples <- 5
ls <- lapply(1:n_unique_samples, random_numb_generator, numb=25) #create a list of random numbers
# convert list to dataframe
df <- do.call(data.frame, ls)
##rename columns of data frame
names_raw <- c(paste0("treatment_", letters[1:n_unique_samples],1:2),
paste0("treatment_", letters[1:n_unique_samples],c(2,1)))
names(df) <- sort(names_raw)
#add tag
df <- df %>% mutate(gene.symbol = paste0("gene", row_number()))
######################################################################
#### make function to mutate table and prepare for plot #################
######################################################################
plot_exp <- function(dat_in, y_var, labels_col){
#enquo variables
y_var <- enquo(y_var)
y_var_name = quo_name(y_var)
#mutate df to allow plotting
dat_log2 <- dat_in %>% mutate(labels = case_when({{labels_col}} >= abs(2) ~ as.character(gene.symbol),
TRUE ~ ""),
color_codes = case_when(labels == "" ~ "Log2FC_below2",
TRUE ~ "Log2FC_above2")) %>%
select(c({{y_var}}, {{labels_col}}, labels, color_codes, gene.symbol))
#head(dat_log2)
print(paste0("/path/to/save/",{{y_var_name}},".pdf"))
return(dat_log2)
}
######################################################################
#### unit test function and with purrr::map2 and #################
######################################################################
Here test function with two pairs of variables
#works fine
plot_exp(dat_in=df, y_var=treatment_a2, labels_col=treatment_a1)
#create separate vectors
col1 <- sort(names_raw)[str_detect(sort(names_raw),"1")]
col2 <- sort(names_raw)[str_detect(sort(names_raw),"2")]
##works but color_codes, `Log2FC_above2` and `Log2FC_below2` is wrong
map2(col1,col2, ~plot_exp(dat_in=df, y_var=.y, labels_col=.y))