Объяснение тильды в аргументах функции - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь понять, как построить анимацию накопительных линий с помощью plotly. Код из «Графической библиотеки с открытым исходным кодом Plotly R» приведен ниже:

library(plotly)

accumulate_by <- function(dat, var) {
  var <- lazyeval::f_eval(var, dat)
  lvls <- plotly:::getLevels(var)
  dats <- lapply(seq_along(lvls), function(x) {
    cbind(dat[var %in% lvls[seq(1, x)], ], frame = lvls[[x]])
  })
  dplyr::bind_rows(dats)
}

df <- txhousing 
fig <- df %>%
  filter(year > 2005, city %in% c("Abilene", "Bay Area"))
fig <- fig %>% accumulate_by(~date)
  1. Основной вопрос - объяснить, что происходит, когда мы передаем ~date в accumulate_by функция. Какие значения dat и var переменные получат? И как это работает?
  2. Если я понимаю, какие значения принимают переменные var и dat, становится понятно, что делает функция f_eval, но теперь я этого не понимаю.
  3. Что такое plotly:::getLevels? Я имею в виду, я не нашел никакой документации об этой функции.

1 Ответ

1 голос
/ 09 апреля 2020
  1. Основной вопрос состоит в том, чтобы объяснить, что происходит, когда мы передаем ~ дату в функцию collectulate_by. Какие значения получат переменные dat и var? И как это работает?

    accumulate_by будет принимать любые значения dat и var, переданные ему, в указанном порядке. Это означает, что если вы передадите accumulate_by(Var1, Var2), то же самое, что и accumulate_by(dat = Var1, var = Var2). Это называется позиционным соответствием.

    Поскольку код написан, fig - это ваша dat переменная, поскольку она входит в accumulate_by через канал (%>%) в первой позиции. ~date - ваша var переменная, потому что она находится на второй позиции.

    ~ перед датой означает «по», поэтому «по дате».

    Что accummlate_by фактически собирает все строки и все переменные с заданным значением даты в новую переменную с именем level. Затем он переходит к следующему значению даты и собирает все строки и переменные для этой даты, а также все строки и переменные для всех предыдущих значений даты и присваивает это другое значение для level. Вы можете проверить str(fig) до и после применения accumulate_by, чтобы увидеть, что fig становится намного длиннее (намного больше строк) и получает другую переменную с именем level после применения accumulate_by.

  2. Если я понимаю, какие значения принимают переменные var и dat, становится ясно, что делает функция f_eval, но теперь я не понимаю этого.

    Адресовано (надеюсь) в ответе на вопрос 1.

  3. Что такое заговор ::: getLevels? Я имею в виду, что я не нашел никакой документации об этой функции.

    Тройное двоеточие означает «искать весь пакет (в данном случае это пакет plotly), включая неэкспортированные элементы в пакете» , На практике это означает, что многие пакеты имеют вспомогательные функции и другие утилиты, которые обычно не используются конечными пользователями. Вместо этого эти вспомогательные функции используются другими функциями в пакете. Вспомогательные функции не «экспортируются», то есть обычно доступны только путем ввода их имен. Однако к ним можно получить доступ, используя тройное двоеточие :::.

    Поскольку getLevels на самом деле не предназначен для использования plotly пользователями пакета, скорее всего, оно не задокументировано.

...