#r #dplyr #rlang
#r #dplyr #rlang
Вопрос:
Я хотел бы обобщить некоторые данные при их фильтрации.
Он хорошо работает с объявленными переменными, но мне не хватает символов.
Ошибка: object of type 'symbol' is not subsettable
Я хотел бы найти обходной путь для решения этой проблемы.
library(datasets)
library(magrittr)
library(dplyr)
#>
#> Attachement du package : 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
data(cars)
cars %<>% as_tibble()
test <- function (.data = NULL, x = NULL, y = NULL) {
xs <- rlang::sym(x)
ys <- rlang::sym(y)
.data %>%
summarise(
sym_work = mean(!!xs),
work = mean(dist[speed == 10]),
not_work = mean(!!xs[!!ys == 10])
)
}
test(.data = cars, x = "dist", y = "speed")
#> Error in xs[!!ys == 10]: objet de type 'symbol' non indiçable
Создано 2020-11-10 пакетом reprex (версия 0.3.0)
Ответ №1:
Из-за приоритета оператора на данный момент ваш код интерпретируется как !!(xs[!!ys == 10])
which не имеет смысла. Вам нужно (!!xs)[!!ys == 10]
:
library(datasets)
library(magrittr)
library(dplyr)
#> Warning: package 'dplyr' was built under R version 3.6.3
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
data(cars)
cars %<>% as_tibble()
test <- function (.data = NULL, x = NULL, y = NULL) {
xs <- rlang::sym(x)
ys <- rlang::sym(y)
.data %>%
summarise(
sym_work = mean(!!xs),
work = mean(dist[speed == 10]),
not_work = mean((!!xs)[!!ys == 10])
)
}
test(.data = cars, x = "dist", y = "speed")
#> # A tibble: 1 x 3
#> sym_work work not_work
#> <dbl> <dbl> <dbl>
#> 1 43.0 26 26
Создано 2020-11-10 пакетом reprex (версия 0.3.0)