Ответ - да, цель 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
# ...