Подмножество символьного объекта в R

#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)