Как передать выражение в глагол filter () аккуратным способом? - PullRequest
2 голосов
/ 16 октября 2019

У меня есть способ, который работает, а другой - нет, и я не могу понять, что не так с последним. Здесь:

library(tidyverse)
get_these <- c(`Ideal E` = "cut == 'Ideal' & color == 'E'", 
               `Good J` = "cut == 'Good' & color == 'J'")

# This works:
get_these %>% 
  map(rlang::parse_expr) %>% 
  map(function(pick_these) 
    diamonds %>% 
      filter(!!pick_these)) %>% 
  tibble(goods = .) %>% 
  mutate(wat = names(get_these))

# This does not:
tibble(pick_these = get_these %>% 
         map(rlang::parse_expr)) %>% 
  mutate(wat = names(get_these), 
         goods = list(diamonds)) %>% 
  mutate(goods = pmap(.l = dplyr::select(., 
                                         goods, 
                                         pick_these), 
                      .f = function(goods, pick_these) {
                        goods %>% filter(!!pick_these)
                      })) %>% 
  dplyr::select(goods, wat)

Ответы [ 2 ]

2 голосов
/ 16 октября 2019

Мы можем select интересующие столбцы и извлечь компоненты с помощью ..1, ..2 (или .x, .y - если есть только 2 столбца)

library(dplyr)
library(tibble)
library(purrr)
tibble(pick_these = get_these %>% 
         map(rlang::parse_expr)) %>% 
  mutate(wat = names(get_these), 
         goods = list(diamonds))  %>% 
         mutate(goods = pmap(select(., goods, pick_these), ~ {
                                     ..1 %>% 
                                          filter(rlang::eval_tidy( ..2))

                                         })) %>%
                                          dplyr::select(goods, wat)

# A tibble: 2 x 2
#  goods                 wat    
#  <list>                <chr>  
#1 <tibble [3,903 × 10]> Ideal E
#2 <tibble [307 × 10]>   Good J 
1 голос
/ 16 октября 2019

На самом деле, это работает:

tibble(pick_these = get_these %>% 
         map(rlang::parse_expr)) %>% 
  mutate(wat = names(get_these), 
         goods = list(diamonds)) %>% 
  mutate(goods = pmap(.l = dplyr::select(., 
                                         goods, 
                                         pick_these), 
                      .f = function(goods, pick_these) {
                        goods %>% filter(rlang::eval_tidy(pick_these))
                      })) %>% 
  dplyr::select(goods, wat)

Таким образом, хитрость заключается в использовании rlang::eval_tidy() вместо !!. Я понятия не имел, прежде чем читать ответ @ akrun, и до сих пор не понимаю, почему !! не работает в этом контексте.

...