Как мне получить доступ / использовать имя объекта R в функции? (часть 2) - PullRequest
0 голосов
/ 13 января 2020

Для контекста, это продолжение для этого вопроса

Я хочу создать функцию, которая создает число значений из вектора академических c кредитов. 1,5 академических c кредита равны одной неделе обучения в моей стране, это означает, что я могу использовать вектор академических c кредитов на модуль для определения ожидаемых кредитов на определенную дату.

Ради Для ясности вектор выглядит так:

Ekonom<-c(15,15,15,15,7.5,7.5,15,7.5,7.5,15,15,15,30,0)

Это, однако, предполагает, что я связываю вектор академических c кредитов с правильной датой начала. Я могу получить уникальные даты начала для каждой программы, используя следующую функцию:

 start_dates<-function(x){

  fulldata%>%
    filter(program == as.character(rlang::enexpr(x))) %>%
    distinct(UTBILDNINGSTILLFALLE_STARTDATUM)%>%drop_na()
}

Если я введу название вектора академических c кредитов (называемых "Экономи" для программы "Экономика") в эту функцию Я получу уникальные даты начала из соответствующей программы (также называемой «Ekonomi»).

Но дата начала - только одно из нескольких значений, которые меня интересуют, полное выражение ближе к этому:

start_dates<-function(x){
summer_break<-ifelse(cumsum(x)<=60, 0, ifelse(cumsum(x)>60 & cumsum(x)<=120 , 1,2))
sd<-fulldata%>%
    filter(program == as.character(rlang::enexpr(x))) %>%
    distinct(UTBILDNINGSTILLFALLE_STARTDATUM)%>%drop_na()
program<-cbind(x,summer_break)
program<-as.data.frame(program)
program<-program%>%rename(points=x)
program<-program%>%mutate(weeks_course=points/1.5)
program<-program%>%mutate(points_expected=lag(cumsum(points)))
program<-program%>%mutate(points_expected=ifelse(is.na(points_expected),0,points_expected))
program<-program%>%mutate(order=1:n())
program<-crossing(sd, program)
program<-program%>%arrange(sd, order)

}

Когда я использую это выражение, я не получаю даты начала. Я получаю сообщение об ошибке, утверждающее, что:

In program == as.character(rlang::enexpr(x)) :
  longer object length is not a multiple of shorter object length

Что я делаю не так и как я могу заставить эту работу работать?

Мой желаемый вывод выглядит так:

structure(list(sd = structure(c(15586, 15586, 15586, 15586, 15586, 
15586, 15586, 15586, 15586, 15586, 15586, 15586, 15586, 15586, 
15950, 15950, 15950, 15950, 15950, 15950, 15950, 15950, 15950, 
15950, 15950, 15950, 15950, 15950, 16314, 16314, 16314, 16314, 
16314, 16314, 16314, 16314, 16314, 16314, 16314, 16314, 16314, 
16314, 16678, 16678, 16678, 16678, 16678, 16678, 16678, 16678, 
16678, 16678, 16678, 16678, 16678, 16678, 17042, 17042, 17042, 
17042, 17042, 17042, 17042, 17042, 17042, 17042, 17042, 17042, 
17042, 17042, 17406, 17406, 17406, 17406, 17406, 17406, 17406, 
17406, 17406, 17406, 17406, 17406, 17406, 17406, 17777, 17777, 
17777, 17777, 17777, 17777, 17777, 17777, 17777, 17777, 17777, 
17777, 17777, 17777, 18141, 18141, 18141, 18141, 18141, 18141, 
18141, 18141, 18141, 18141, 18141, 18141, 18141, 18141), class = "Date"), 
    points_ekon = c(15, 15, 15, 15, 7.5, 7.5, 15, 7.5, 7.5, 15, 
    15, 15, 30, 0, 15, 15, 15, 15, 7.5, 7.5, 15, 7.5, 7.5, 15, 
    15, 15, 30, 0, 15, 15, 15, 15, 7.5, 7.5, 15, 7.5, 7.5, 15, 
    15, 15, 30, 0, 15, 15, 15, 15, 7.5, 7.5, 15, 7.5, 7.5, 15, 
    15, 15, 30, 0, 15, 15, 15, 15, 7.5, 7.5, 15, 7.5, 7.5, 15, 
    15, 15, 30, 0, 15, 15, 15, 15, 7.5, 7.5, 15, 7.5, 7.5, 15, 
    15, 15, 30, 0, 15, 15, 15, 15, 7.5, 7.5, 15, 7.5, 7.5, 15, 
    15, 15, 30, 0, 15, 15, 15, 15, 7.5, 7.5, 15, 7.5, 7.5, 15, 
    15, 15, 30, 0), summer_break_ekon = c(0, 0, 0, 0, 1, 1, 1, 
    1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 
    2, 2, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 
    0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1, 
    1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 
    2, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 
    1, 1, 1, 1, 1, 1, 2, 2, 2, 2), weeks_course = c(10, 10, 10, 
    10, 5, 5, 10, 5, 5, 10, 10, 10, 20, 0, 10, 10, 10, 10, 5, 
    5, 10, 5, 5, 10, 10, 10, 20, 0, 10, 10, 10, 10, 5, 5, 10, 
    5, 5, 10, 10, 10, 20, 0, 10, 10, 10, 10, 5, 5, 10, 5, 5, 
    10, 10, 10, 20, 0, 10, 10, 10, 10, 5, 5, 10, 5, 5, 10, 10, 
    10, 20, 0, 10, 10, 10, 10, 5, 5, 10, 5, 5, 10, 10, 10, 20, 
    0, 10, 10, 10, 10, 5, 5, 10, 5, 5, 10, 10, 10, 20, 0, 10, 
    10, 10, 10, 5, 5, 10, 5, 5, 10, 10, 10, 20, 0), points_expected = c(0, 
    15, 30, 45, 60, 67.5, 75, 90, 97.5, 105, 120, 135, 150, 180, 
    0, 15, 30, 45, 60, 67.5, 75, 90, 97.5, 105, 120, 135, 150, 
    180, 0, 15, 30, 45, 60, 67.5, 75, 90, 97.5, 105, 120, 135, 
    150, 180, 0, 15, 30, 45, 60, 67.5, 75, 90, 97.5, 105, 120, 
    135, 150, 180, 0, 15, 30, 45, 60, 67.5, 75, 90, 97.5, 105, 
    120, 135, 150, 180, 0, 15, 30, 45, 60, 67.5, 75, 90, 97.5, 
    105, 120, 135, 150, 180, 0, 15, 30, 45, 60, 67.5, 75, 90, 
    97.5, 105, 120, 135, 150, 180, 0, 15, 30, 45, 60, 67.5, 75, 
    90, 97.5, 105, 120, 135, 150, 180), order = c(1L, 2L, 3L, 
    4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 1L, 2L, 
    3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 1L, 
    2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 
    1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 
    1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 
    1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 
    1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 
    1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L
    )), row.names = c(NA, -112L), class = c("tbl_df", "tbl", 
"data.frame"))

Small exerpt of data:

structure(list(UTBILDNINGSTILLFALLE_STARTDATUM = structure(c(15586, 
15586, 15586, 15586, 15586, 15586, 15586, 15586, NA, 15586, 15586, 
NA, 15586, 15586, 15586, NA, 15586, 15586, 15586, 15586), class = "Date"), 
    program = c("Ekonom", "Mäklarekonom", "Ekonom", "Mäklarekonom", 
    "Ekonom", "Ekonom", "Ekonom", "Ekonom", "Mäklarekonom", "Ekonom", 
    "Ekonom", "Mäklarekonom", "Ekonom", "Ekonom", "Mäklarekonom", 
    "Mäklarekonom", "Ekonom", "Ekonom", "Mäklarekonom", "Mäklarekonom"
    )), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-20L))
...