Как передать список переменных в функцию, а также с учетом кавычек и цитирования - PullRequest
0 голосов
/ 09 января 2019

Я бы хотел передать список переменных в функцию, но меня смущают цитаты и фразы.

Обычно я хочу вернуть df после некоторого управления данными - после того, как функция была применена к нескольким переменным.

Как таковая функция работает нормально (только слегка измененная из обмена стека пользователей ответ на другой вопрос), но в этом примере вызовы повторяются. Буду признателен за любые предложения, замечания по чтению и т. Д.

library(tidyverse)
library(rlang)
library(tidyselect)

data <- data.frame(ageeeeoo = c(1,NA,3,NA,5), 
                   ageeeaah = c(NA,2,NA,4,NA),
                   numnumd  = c(1,NA,3,NA,5),
                   numfoofe = c(NA,2,NA,4,NA))



newfun <- function (var1) {

var1<-enquo(var1)
data<<-mutate(data,(!!as_name(var1)) := coalesce(!!! syms(vars_select(names(data), 
                                       starts_with(as_name(var1))))))
}


newfun(age)
newfun(num)



  ageeeeoo ageeeaah numnumd numfoofe age num
        1       NA       1       NA   1   1
       NA        2      NA        2   2   2
        3       NA       3       NA   3   3
       NA        4      NA        4   4   4
        5       NA       5       NA   5   5

Я попытался просмотреть программные документы dplyr и несколько других обменов стека QA , но цитирование выбило меня из колеи. Я пытался использовать alist и list, но получаю ошибки.

listofvars<-c("age","num")

newfun <- function (...) {

data<<-mutate(data,(!!!rlang::syms(...)) := coalesce(!!! syms(vars_select(names(data),
                                            starts_with(!!!quos(...))))))
}


  newfun(listofvars)

1 Ответ

0 голосов
/ 20 февраля 2019
library(tidyverse)
library(rlang)
library(tidyselect)

data <- data.frame(ageeeeoo = c(1,NA,3,NA,5), 
                   ageeeaah = c(NA,2,NA,4,NA),
                   numnumd  = c(1,NA,3,NA,5),
                   numfoofe = c(NA,2,NA,4,NA))



newfun2 <- function (data, ...) {

  vars <- ensyms(..., .named = TRUE)
  needed <- map(
    vars,
    ~vars_select(names(data), starts_with(as_name(.x))) %>% 
    {quo(coalesce(!!!syms(.)))}
  )
  mutate(data, !!!needed)
}

data <- newfun2(data, age, num)

list_of_vars <- exprs(age, num)
data <- newfun2(data, !!!list_of_vars)
data

Сначала фиксируются входные данные из ... в виде символов. Он может использовать purrr::map для генерации списка coalesce операций. Затем они поставляются на mutate. Я переписал код, чтобы не изменять глобальную среду внутри функции; большая часть кода R работает следующим образом, поэтому в общем случае переменные не будут изменены, за исключением явного присвоения.

Справка по rlang и продвинутая версия Hadley Wickham R - это отличные ресурсы.

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