@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

Ответы на вопрос(3)

Ваш ответ на вопрос