Используйте substitute
, который возвращает объект класса name
. Мы завернули вызов message
в on.exit
, чтобы убедиться, что он выполняется после вычисления, чтобы он не выполнялся в случае сбоя вычисления. Если это не важно, тогда замените on.exit(message(...))
на message(...)
. Обратите внимание, что add1
сам по себе не использует никаких пакетов.
library(dplyr)
add1 <- function(numeric_vector) {
on.exit(message("You mutated ", substitute(numeric_vector)))
1 + numeric_vector
}
BOD %>% mutate(Time = add1(Time))
, дающий:
You mutated Time
Time demand
1 2 8.3
2 3 10.3
3 4 19.0
4 5 16.0
5 6 15.6
6 8 19.8
rlang
Чтобы использовать rlang, используйте enexpr
из этогопакет. dplyr сделает его доступным. enexpr
возвращает объект класса name
.
enexpr
аналогичен substitute
, но одно отличие, которое повлияет на обработку, заключается в том, что substitute
извлечет кодовую часть обещания независимо от того, было ли оно выполнено (то есть выполнено);однако enexpr
извлечет код невыполненных обещаний, но извлечет значение принудительных обещаний. Поскольку нам нужна часть кода, мы должны убедиться, что enexpr(numeric_vector)
выполняется , прежде чем numeric_vector
будет использоваться в вычислениях. Чтобы убедиться, что мы вводим новую переменную arg_name
, которая запускается в начале, гарантируя, что enexpr
имеет необязательный аргумент.
library(dplyr)
add2 <- function(numeric_vector) {
arg_name <- enexpr(numeric_vector)
on.exit(message("You mutated ", arg_name))
1 + numeric_vector
}
BOD %>% mutate(Time = add2(Time))