Как я могу получить доступ к имени столбца в функции при вызове mutate? - PullRequest
1 голос
/ 24 октября 2019

Я изменяю столбец, чтобы создать новый в R, используя функцию, которую я написал.

Внутри моей функции я хочу отправить сообщение, содержащее имя изменяемого столбца.

Как получить доступ к имени столбца, которое изменяется изнутри функциив вызове mutate?

Воспроизводимый пример:

data <- tribble(
 ~colB, 
  1, 
  2, 
  3
)

# Function that will be used in the mutate
add1 <- function(numeric_vector) {
  return(1 +numeric_vector)

  # I want to message the user the name of the column they are mutating
  # This simply returns the entire vector
  message("You mutated", numeric vector)

  # This returns 'numeric_vector'
  message("You mutated", quo_name(quo(numeric_vector)))

}

# Desired Output:
data %>% 
  mutate(colC = add1(colB))

You mutated colB
 colB  colC
 <dbl> <dbl>
   1     2
   2     3
   3     4

Ответы [ 2 ]

3 голосов
/ 25 октября 2019

Используйте 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))
2 голосов
/ 24 октября 2019

Я думаю, что вы хотите

add1 <- function(numeric_vector) {
  message(paste("You mutated", quo_name(enquo(numeric_vector))))
  return(1 + numeric_vector)
}

Обратите внимание, что вы должны напечатать ваше сообщение до return(). Ничто после return() не будет работать в функции, потому что вы выходите при нажатии на этот оператор. Также вы можете использовать enquo(), чтобы получить переменную, чтобы получить ее имя. И вам нужно получить его имя, пока оно еще в состоянии обещания, так что это означает, что перед тем, как вы на самом деле используете его значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...