I want to create a function that takes up as the first argument the name of a data set, and as a second argument, part of a column's name from the dataframe. I then want to use glue
to dynamically construct the column name, in the function, and use that column in a mutate
call, like so:
library(tidyverse)
tmp <-
function(data, type){
var <- glue::glue("Sepal.{type}")
iris |>
select({{var}}) |>
mutate("{var}" := mean({{var}}))
}
I've tried a lot of things, but I struggle to find a solution where the column is called both for the name of the new column (here, "{var}"
) and for the computation of the new column (here, mean({{var}})
). What should one do in such cases?
Here, calling tmp(iris, "Length")
should return a 150x1
data.frame with the mean value in all rows.
tidyverse
solution are preferred, or any pipe-based answers.
You can use mean({{var}})
if you modify your code just a little bit, for example, using as.symbol
(or as.name
) to define var
, instead of a glue
char
tmp <- function(data, type) {
var <- as.symbol(glue::glue("Sepal.{type}"))
data |>
select(var) |>
mutate("{var}" := mean({{ var }}))
}
For some alternatives, I guess you can try get(var)
or !!rlang::syms(var)
, for example
tmp <- function(data, type) {
var <- glue::glue("Sepal.{type}")
data |>
select({{ var }}) |>
mutate("{var}" := mean(get(var)))
}
or
tmp <- function(data, type) {
var <- rlang::sym(glue::glue("Sepal.{type}"))
data |>
select(var) |>
mutate("{var}" := mean(!!var))
}