вопрос об аккуратности при цитировании кода с использованием var () - PullRequest
1 голос
/ 20 октября 2019

Я читаю этот аккуратный оценочный документ https://tidyeval.tidyverse.org/sec-why-how.html и не могу понять, почему первый фрагмент кода здесь не работает, а второй работает:

starwars %>% summarise_at(ends_with("color"), n_distinct)

starwars %>% summarise_at(vars(ends_with("color")), n_distinct)

Первый фрагменткода показывает сообщение об ошибке: «Переменные tidyselect не были зарегистрированы»

Я понял тогда, что по каким-то причинам не удается найти столбцы в кадре данных звездных войн, заканчивающиеся цветом.

Что такоеvars () делать, чтобы он находил столбцы в кадре данных starwars? Это как-то связано с окружающей средой?

Ответы [ 2 ]

1 голос
/ 21 октября 2019

vars() препятствует немедленной оценке аргументов. Если вы вызовете его в консоли, вы увидите, что он возвращает чертежи для вычисления значений (то есть выражений) вместо самих значений:

> dplyr::vars(ends_with("color"))
<list_of<quosure>>

[[1]]
<quosure>
expr: ^ends_with("color")
env:  global

Эти отложенные вычисления возобновляются позже, в контексте, где переменныесделаны доступными. Если вы запустите их сразу, контекст не будет установлен, и вы получите ошибку tidyselect.

1 голос
/ 20 октября 2019

vars(...) необходим для правильного заполнения аргумента vars для ends_with. Если вы заполните его сами, то вам не понадобятся vars

starwars %>% summarise_at(ends_with("color", vars = names(.)), n_distinct)

, дающие:

# A tibble: 1 x 3
  hair_color skin_color eye_color
       <int>      <int>     <int>
1         13         31        15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...