Что `sym ()` делает с tidyeval? - PullRequest
0 голосов
/ 19 ноября 2018
library(tidyverse)
input_name <- "birth_year"
input_value <- 19

quo(filter(starwars, !!input_name == !!input_value))       # line 5
quo(filter(starwars, !!sym(input_name) == !!input_value))  # line 6

В чем разница между строкой № 5 и строкой № 6 и использованием функции sym()? Почему sym() требуется только в левой части уравнения в строке # 6?

Имеет ли смысл sym() брать строки символов и заключать их в символы без кавычек?

Строка 5

<quosure>
  expr: ^filter(data, "birth_year" == 19)
  env:  global

Строка 6

<quosure>
  expr: ^filter(data, birth_year == 19)
  env:  global

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Ответ - да, цель sym() - взять строки символов и разобрать их в символы.Причина, по которой вам нужно это в левой части равенства, видна в ?filter:

 ...: Logical predicates defined in terms of the variables in
      ‘.data’. Multiple conditions are combined with ‘&’. Only rows
      where the condition evaluates to ‘TRUE’ are kept.

filter( starwars, "birth_year" == 19 ) всегда не даст результатов, потому что строковый литерал "birth_year" никогда не равен целочисленному литералу 19 (который неявно приводится к символьному литералу "19" в сравнении).Используя sym, вы эффективно разбираете эту строку в символ, заставляя filter просматривать столбец с именем birth_year во фрейме данных starwars, а не буквальную строку "birth_year".

* 1020.* И наоборот, вам не нужно нужно sym() в правой части уравнения, поскольку в starwars нет столбца 19, и вас интересует фактическое значение литерала19 вместо.Если бы вы сравнивали два столбца во фрейме данных, вы бы хотели sym() с обеих сторон равенства.Например,
name1 <- "skin_color"
name2 <- "eye_color"
filter( starwars, !!sym(name1) == !!sym(name2) )
# # A tibble: 6 x 13
#   name  height  mass hair_color skin_color eye_color birth_year gender homeworld
#   <chr>  <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr>  <chr>    
# 1 Wick…     88    20 brown      brown      brown              8 male   Endor    
# 2 Jar …    196    66 none       orange     orange            52 male   Naboo    
# 3 Eeth…    171    NA black      brown      brown             NA male   Iridonia 
# 4 Mas …    196    NA none       blue       blue              NA male   Champala 
# ...
0 голосов
/ 19 ноября 2018

В первом случае столбец не оценивается, это строка, которая оценивается. Но, преобразовав в symbol и оценив его, он возвращает значения столбца. sym требуется в lhs, потому что мы не пытаемся получить буквальное значение, а извлекаем значение столбца

Согласно ?sym

sym () создает символ из строки, а syms () создает список символов из символьного вектора.

и ?"!!"

!! Оператор приводит кавычки своего аргумента. Это немедленно оценивается в окружающем контексте.

...