Предоставление пользовательских функций без кавычек аргументов в purrr - PullRequest
0 голосов
/ 24 марта 2020

Я учу квази-цитаты и цитаты с . Моя функция проверяет, есть ли forbidden_values в любом из упомянутых переменных selectlist, и помечает строку с любым положительным результатом как 1, иначе 0.

  • Как я могу заставить rlang интерпретировать ввод без кавычек в список выбора аргументов в функциональной среде, а не в глобальной среде?

  • Поскольку я предоставляю список значений, почему я должен использовать !! вместо !!!?

  • Почему я могу предоставить анонимную формулу любой функции с dot-dot-dot operator?

Эта функция работает только с именами переменных для выбора в кавычках "".

selectlist <- function(df, selectlist, forbidden_values){
  enquos(selectlist)
  enquos(forbidden_values)


  df %>% mutate(is_injured = purrr::pmap_int(select(.,!!selectlist), ~any(c(...) %in% !!forbidden_values)))

}

Работает

selectlist(expected, selectlist=c("PrimaryInjury","SecondaryInjury"),forbidden_values=c("Rust","Insect","Snow break"))
  plantid year PrimaryInjury SecondaryInjury OtherInjury is_injured
1        1    1          <NA>            <NA>        <NA>          0
2        1    2        Insect            <NA>        <NA>          1
3        1    3          <NA>            <NA>        <NA>          0
4        2    1          <NA>            <NA>        <NA>          0
5        2    2          <NA>            <NA>        <NA>          0
6        2    3          Rust            <NA>        <NA>          1
7        3    1          <NA>            <NA>        <NA>          0
8        3    2          <NA>            <NA>        <NA>          0
9        3    3          <NA>            <NA>        <NA>          0
10       4    1          Rust            <NA>        <NA>          1
11       4    2          <NA>            <NA>        <NA>          0
12       4    3        Insect            <NA>        <NA>          1
13       5    1    Snow break            <NA>        <NA>          1
14       5    2          Rust            <NA>        <NA>          1
15       5    3          <NA>            <NA>        <NA>          0

Не работает

selectlist(expected, selectlist=c(PrimaryInjury,SecondaryInjury),forbidden_values=c("Rust","Insect","Snow break"))

Ошибка в соединении (dot_call (capture_dots, frame_env = frame_env, named = named,: объект 'PrimaryInjury' не найден

Спасибо за помощь ...

Пример кадра данных: ожидается

plantid <- rep(c(1,2,3,4,5), times=c(3,3,3,3,3))
year <- rep(1:3, length.out=length(plantid))
set.seed(42)
PrimaryInjury <- sample(c(NA,NA,NA,"Rust","Insect","Snow break"), 15, replace=TRUE)
SecondaryInjury <- rep(NA, length.out=length(plantid))
OtherInjury <- rep(NA, length.out=length(plantid))

expected <- data.frame(plantid,year,PrimaryInjury,SecondaryInjury, OtherInjury)

#All in selectlist must be characters.
expected$PrimaryInjury <- as.character(expected$PrimaryInjury)
expected$SecondaryInjury <- as.character(expected$SecondaryInjury)
expected$OtherInjury <- as.character(expected$OtherInjury)

dput expected

structure(list(plantid = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 
5, 5, 5), year = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
3L, 1L, 2L, 3L), PrimaryInjury = c(NA, "Insect", NA, NA, NA, 
"Rust", NA, NA, NA, "Rust", NA, "Insect", "Snow break", "Rust", 
NA), SecondaryInjury = c(NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_), OtherInjury = c(NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_)), row.names = c(NA, 
-15L), class = "data.frame")

1 Ответ

1 голос
/ 25 марта 2020

Если нормально передавать переменные без кавычек по отдельности, мы можем использовать три точки

selectlist <- function(df, forbidden_values, ...){

    df %>% mutate(is_injured = purrr::pmap_int(select(.,...), 
                               ~any(c(...) %in% forbidden_values)))
}

selectlist(expected, forbidden_values= c("Rust","Insect","Snow break"), 
                      PrimaryInjury, SecondaryInjury)


#   plantid year PrimaryInjury SecondaryInjury OtherInjury is_injured
#1        1    1          <NA>            <NA>        <NA>          0
#2        1    2        Insect            <NA>        <NA>          1
#3        1    3          <NA>            <NA>        <NA>          0
#4        2    1          <NA>            <NA>        <NA>          0
#5        2    2          <NA>            <NA>        <NA>          0
#6        2    3          Rust            <NA>        <NA>          1
#7        3    1          <NA>            <NA>        <NA>          0
#8        3    2          <NA>            <NA>        <NA>          0
#9        3    3          <NA>            <NA>        <NA>          0
#10       4    1          Rust            <NA>        <NA>          1
#11       4    2          <NA>            <NA>        <NA>          0
#12       4    3        Insect            <NA>        <NA>          1
#13       5    1    Snow break            <NA>        <NA>          1
#14       5    2          Rust            <NA>        <NA>          1
#15       5    3          <NA>            <NA>        <NA>          0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...