Вы можете использовать rlang::ensym()
, чтобы захватить имя переменной и передать ее непосредственно mutate_at
:
library(tidyverse)
clean.names2 <- function( .df, .var ) {
f <- compose( partial(str_remove_all, pattern='[:punct:]'),
str_to_lower, str_squish, str_trim )
.df %>% mutate_at( vars(!!ensym(.var)), f )
}
Функция работает с именами переменных, предоставленными и без кавычек:
X <- tibble( Cities = c(" New York City, NY", "Denver, CO;;") )
clean.names2( X, Cities )
# # A tibble: 2 x 1
# Cities
# <chr>
# 1 new york city ny
# 2 denver co
clean.names2( X, "Cities" ) ## equivalent
Краткое объяснение:
В первой строке создается составная функция путем объединения вместе str_remove_all
, str_to_lower
, str_squish
, str_trim
и использования partial()
для назначениязаданное значение для параметра pattern
, равное str_remove_all
.Полученная функция f
идентична вашей исходной clean.names
.(Я только что попытался сделать clean.names2
автономным.)
Вторая строка применяет новую составную функцию f
(или, что эквивалентно, ваш исходный clean.names
) к одному столбцу в .df
, используяmutate_at
.Столбец указывается с использованием двух механизмов обратного хода.Первый - vars()
, который позволяет пользователям указывать имена столбцов с кавычками и без них.Например, следующие две строки эквивалентны:
mydf %>% mutate_at( vars("mycolumn"), myfunction ) # vars can be dropped here
mydf %>% mutate_at( vars(mycolumn), myfunction )
Второй механизм принадлежит классу функций, которые имеют дело с квазикватацией , позволяя программистам работать напрямую с неоцененными выражениями, в том числепредоставляемые пользователями функции.В частности, мы используем ensym
для захвата символа, предоставленного функции вызывающей средой, и передачи этого символа в vars
.!!
важен, потому что он говорит vars
идти вперед и оценить выражение ensym(.var)
и использовать результат в качестве имени столбца.Без !!
, vars
будет пытаться найти столбец с именем «ensym (.var)».