Хотя вопрос старый, и награда уже присуждена, я хотел бы расширить отличный ответ gersht, который отлично работает для получения имени объекта с самой левой стороны. Однако интеграция этой функциональности в рабочий процесс dplyr еще не решена, за исключением использования этого подхода на самом последнем этапе пайпа.
Поскольку я часто использую dplyr, я создал группу пользовательских функций-оболочек вокруг общих глаголов dplyr, которые я называю metadplyr
(я все еще играю с функциональностью, поэтому я еще не загрузил ее на github ).
По сути, эти функции создают новый класс с именем meta_tbl
поверх таблицы и записывают определенные вещи в атрибутах этого объекта. Применительно к проблеме OP я привожу простой пример с filter
, но процедура работает и с любым другим глаголом dplyr.
В моем исходном семействе функций я использую немного другие имена, чем dplyr, но этот подход также работает при «перезаписи» исходных глаголов dplyr.
Ниже представлена новая функция фильтра, которая превращает фрейм данных или табличку в meta_tbl и записывает исходное имя объекта lhs в атрибут .name
. Здесь я использую укороченную версию подхода Гершта.
library(dplyr)
filter <- function(.data, ...) {
if(!("meta_tbl" %in% class(.data))) {
.data2 <- as_tibble(.data)
# add new class 'meta_tbl' to data.frame
attr(.data2, "class") <- c(attr(.data2, "class"), "meta_tbl")
# write lhs original name into attributes
i <- 1
while(!("chain_parts" %in% ls(envir=parent.frame(i)))) {
i <- i+1
}
attr(.data2, ".name") <- deparse(parent.frame(i)$lhs)
}
dplyr::filter(.data2, ...)
}
Для удобства полезно иметь вспомогательную функцию, позволяющую легко извлекать исходное имя из атрибутов.
.name <- function(.data) {
if("meta_tbl" %in% class(.data)) {
attr(.data, ".name")
} else stop("this function only work on objects of class 'meta_tbl'")
}
Обе функции можно использовать в рабочем процессе следующим образом:
mtcars %>%
filter(gear == 4) %>%
write.csv(paste0(.name(.), ".csv"))
Это может быть плохим примером, так как канал не продолжается, но теоретически мы могли бы использовать этот канал, включая исходное имя, и передавать его в дальнейших вызовах функций.
person
TimTeaFan
schedule
24.10.2019
df %>% stuff %>% my_func
не может этого сделать, поскольку к моменту, когда он доберется доmy_func
, это вполне может быть совершенно другой объект, и информация о крайнем левом объекте будет потеряна, поэтому я предлагаю просто сделатьmy_func(df)
- person eddi   schedule 06.05.2015