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

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

У меня есть список дат начала и программ для каждого отдельного студента во фрейме данных «fulldata». В качестве первого шага я хочу использовать этот фрейм данных, чтобы получить список уникальных дат начала для определенной программы. В идеале я мог бы автоматизировать этот (и более поздний) этап (ы) с помощью функции, поскольку существует много программ.

В настоящее время у меня есть три программы: экономика (Ekonomi), недвижимость и цифровая СМИ. У меня есть три соответствующих R-объекта (содержащих вектор академических c кредитов для каждого модуля по порядку) с именами «Экономи», «Недвижимость» и «Цифровые медиа». Я хочу получить уникальные значения start_date из «fulldata», где имя программы равно имени моего текущего объекта R

Я пишу:

start_dates<-function(x){
sd<-fulldata%>%filter(program==deparse(substitute(x)))%>%
dplyr::select(UTBILDNINGSTILLFALLE_STARTDATUM)%>%drop_na()%>%unique()
}

Так что для start_dates(Ekonomi) функция следует выбрать даты начала наблюдений с программой, равной «Экономи». Это, похоже, не работает, однако.

Когда я пишу

start_dates(Ekonomi)
sd

Оказывается, что sd не содержит никаких наблюдений.

Я могу написать:

sd<-fulldata%>%filter(program==deparse(substitute(Ekonomi)))%>%
dplyr::select(UTBILDNINGSTILLFALLE_STARTDATUM)%>%drop_na()%>%unique()
}

.. ... а потом sd оказывается вполне нормально, но я не могу сделать то же самое с функцией.

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

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))

1 Ответ

1 голос
/ 13 января 2020

Если вы хотите передать переменную без кавычек для фильтрации, один из способов - использовать rlang::enexpr(x)

library(dplyr)

start_dates<-function(fulldata, x){

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

start_dates(full_data, Ekonom)

# A tibble: 1 x 1
#  UTBILDNINGSTILLFALLE_STARTDATUM
#  <date>                         
#1 2012-09-03             

Передача переменной в кавычках не потребует ни одной из них и может быть выполнена непосредственно как

start_dates<-function(fulldata, x){
   fulldata%>%
     filter(program == x) %>%
     distinct(UTBILDNINGSTILLFALLE_STARTDATUM)
}

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