@JensLeerssen Рад, что это помогло. Вы всегда чему-то учитесь каждый день :)
аюсь написать функцию вtidyverse/dplyr
что я хочу в конечном итоге использовать сlapply
(или жеmap
). (Я работал над этим, чтобыответь на этот вопрос, но наткнулся на интересный результат / тупик. Пожалуйста, не отмечайте это как дубликат - этот вопрос является расширением / отклонением от ответов, которые вы видите там.)
Есть
1) способ получить список переменных в кавычках для работы внутри функции dplyr
(и не использовать устаревшиеSE_
функции)или есть
2) какой-нибудь способ передать список строк без кавычек черезlapply
или жеmap
Я использовалProgramming in Dplyr
Виньетка для построения того, что я считаю, является функцией, наиболее соответствующей текущему стандарту работы с NSE.
sample_data <-
read.table(text = "REVENUEID AMOUNT YEAR REPORT_CODE PAYMENT_METHOD INBOUND_CHANNEL AMOUNT_CAT
1 rev-24985629 30 FY18 S Check Mail 25,50
2 rev-22812413 1 FY16 Q Other Canvassing 0.01,10
3 rev-23508794 100 FY17 Q Credit_card Web 100,250
4 rev-23506121 300 FY17 S Credit_card Mail 250,500
5 rev-23550444 100 FY17 S Credit_card Web 100,250
6 rev-21508672 25 FY14 J Check Mail 25,50
7 rev-24981769 500 FY18 S Credit_card Web 500,1e+03
8 rev-23503684 50 FY17 R Check Mail 50,75
9 rev-24982087 25 FY18 R Check Mail 25,50
10 rev-24979834 50 FY18 R Credit_card Web 50,75
", header = TRUE, stringsAsFactors = FALSE)
Функция генерации отчетовreport <- function(report_cat){
report_cat <- enquo(report_cat)
sample_data %>%
group_by(!!report_cat, YEAR) %>%
summarize(num=n(),total=sum(AMOUNT)) %>%
rename(REPORT_VALUE = !!report_cat) %>%
mutate(REPORT_CATEGORY := as.character(quote(!!report_cat))[2])
}
Который отлично работает для генерации одного отчета:
> report(REPORT_CODE)
# A tibble: 7 x 5
# Groups: REPORT_VALUE [4]
REPORT_VALUE YEAR num total REPORT_CATEGORY
<chr> <chr> <int> <int> <chr>
1 J FY14 1 25 REPORT_CODE
2 Q FY16 1 1 REPORT_CODE
3 Q FY17 1 100 REPORT_CODE
4 R FY17 1 50 REPORT_CODE
5 R FY18 2 75 REPORT_CODE
6 S FY17 2 400 REPORT_CODE
7 S FY18 2 530 REPORT_CODE
Когда я пытаюсь составить список всех 4 отчетов для генерации, все рушится. (Хотя по общему признанию код, требуемый в этой последней строке функции - чтобы вернуть строку, с помощью которой затем заполняется столбец - должен быть достаточно подсказкой, чтобы я заблудился в неправильном направлении.)
#the other reports
cat.list <- c("REPORT_CODE","PAYMENT_METHOD","INBOUND_CHANNEL","AMOUNT_CAT")
# Applying and Mapping attempts
lapply(cat.list, report)
map_df(cat.list, report)
Что приводит к:
> lapply(cat.list, report)
Error in (function (x, strict = TRUE) :
the argument has already been evaluated
> map_df(cat.list, report)
Error in (function (x, strict = TRUE) :
the argument has already been evaluated
Я также пытался преобразовать список строк в имена, прежде чем передать егоapply
а такжеmap
:
library(rlang)
cat.names <- lapply(cat.list, sym)
lapply(cat.names, report)
map_df(cat.names, report)
> lapply(cat.names, report)
Error in (function (x, strict = TRUE) :
the argument has already been evaluated
> map_df(cat.names, report)
Error in (function (x, strict = TRUE) :
the argument has already been evaluated
В любом случае, причина, по которой я задаю этот вопрос, заключается в том, что я думаю, что написал функцию в соответствии с документированными в настоящее время стандартами, но в конечном итоге я не вижу возможности использовать членаapply
или даже изpurrr::map
семья с такой функцией. Если не считать переписывания функции для использованияnames
любитьпользователь сделал здесьhttps://stackoverflow.com/a/47316151/5088194 Есть ли способ заставить эту функцию работать сapply
или жеmap
?
Я надеюсь увидеть это в результате:
# A tibble: 27 x 5
# Groups: REPORT_VALUE [16]
REPORT_VALUE YEAR num total REPORT_CATEGORY
<chr> <chr> <int> <int> <chr>
1 J FY14 1 25 REPORT_CODE
2 Q FY16 1 1 REPORT_CODE
3 Q FY17 1 100 REPORT_CODE
4 R FY17 1 50 REPORT_CODE
5 R FY18 2 75 REPORT_CODE
6 S FY17 2 400 REPORT_CODE
7 S FY18 2 530 REPORT_CODE
8 Check FY14 1 25 PAYMENT_METHOD
9 Check FY17 1 50 PAYMENT_METHOD
10 Check FY18 2 55 PAYMENT_METHOD
# ... with 17 more rows