как использовать элемент вектора символов в качестве аргумента символа для функции, использующей нестандартную оценку: = оператор

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

Вот некоторые данные, взятые из набора данных «рождаемость» в пакете questionr. Важно то, что он включает несколько столбцов помеченных данных.

library(tidyverse)
library(labelled)

df <- structure(list(id_woman = structure(c(391, 1643, 85, 881, 1981, 
                                            1072, 1978, 1607, 738), label = "Woman Id", 
                                          format.spss = "F8.0"), 
                     weight = structure(c(1.80315, 1.80315, 1.80315, 1.80315, 
                                          1.80315, 0.997934, 0.997934, 0.997934, 0.192455), 
                                        label = "Sample weight", format.spss = "F8.2"), 
                     residency = structure(c(2, 2, 2, 2, 2, 2, 2, 2, 2), 
                                           label = "Urban / rural residency", 
                                           labels = c(urban = 1, rural = 2), 
                                           class = "haven_labelled"), 
                     region = structure(c(4, 4, 4, 4, 4, 3, 3, 3, 3), label = "Region", 
                                        labels = c(North = 1, East = 2, South = 3, West = 4),
                                        class = "haven_labelled")), 
                row.names = c(NA, -9L), class = c("tbl_df", "tbl", "data.frame"))

Эта функция просто берет имя переменной и преобразует его из помеченных данных в фактор.

my.func <- function(var){
  df %>%
    mutate({{var}} := to_factor({{var}}))
}

Обе эти линии работают.

my.func(residency)
my.func("residency")

Они возвращают это:

  id_woman weight residency    region
     <dbl>  <dbl> <fct>     <dbl+lbl>
1      391  1.80  rural     4 [West] 
2     1643  1.80  rural     4 [West] 
3       85  1.80  rural     4 [West] 
4      881  1.80  rural     4 [West] 
5     1981  1.80  rural     4 [West] 
6     1072  0.998 rural     3 [South]
7     1978  0.998 rural     3 [South]
8     1607  0.998 rural     3 [South]
9      738  0.192 rural     3 [South]

Проблема возникает, если я пытаюсь указать имя переменной как часть вектора, например:

var.names <- c("residency", "region")

my.func(var.names[1])
 Error: The LHS of `:=` must be a string or a symbol
Call `rlang::last_error()` to see a backtrace 

Я попробовал это, но это также не удалось.

my.func(rlang::sym(var.names[1]))
 Error: The LHS of `:=` must be a string or a symbol
Call `rlang::last_error()` to see a backtrace 

person John J.    schedule 21.01.2020    source источник


Ответы (1)


В этом случае мы должны оценить (!!)

my.func(!!var.names[1])
# A tibble: 9 x 4
#  id_woman weight residency    region
#     <dbl>  <dbl> <fct>     <dbl+lbl>
#1      391  1.80  residency 4 [West] 
#2     1643  1.80  residency 4 [West] 
#3       85  1.80  residency 4 [West] 
#4      881  1.80  residency 4 [West] 
#5     1981  1.80  residency 4 [West] 
#6     1072  0.998 residency 3 [South]
#7     1978  0.998 residency 3 [South]
#8     1607  0.998 residency 3 [South]
#9      738  0.192 residency 3 [South]
person akrun    schedule 21.01.2020