Оператор тильды как параметр функции

#r #plotly

Вопрос:

Я видел этот пример сюжета, и мне интересно, как работает тильда (~) :

 plot_ly(
    x = ~gdpPercap, 
    y = ~lifeExp, 
    size = ~pop, 
    color = ~continent, 
    frame = ~year, 
    text = ~country, 
    hoverinfo = "text",
    type = 'scatter',
    mode = 'markers'
)
 

Я имею в виду, что я понимаю, что он делает (выбирая столбец с тем же именем в фрейме данных), но что на самом деле делает этот оператор? Какова природа идентификатора после тильды (это не переменная, не литерал, …)? Является ли это специфичным для сюжета?
Я видел документацию об операторе тильды в R, но она, похоже, не связана с этим конкретным использованием.
И, наконец, каков синтаксис, если имя столбца во фрейме данных содержит такие символы, как » — «или»/»?

Комментарии:

1. Оператор тильды, на мой взгляд, используется немного чрезмерно(ab), хотя все они в некотором смысле похожи. (1) В базе R он используется для создания formula , которое, помимо прочего, имеет тенденцию включать вызывающую среду; это может быть использовано для (например) определения/извлечения матрицы модели. (2) В rlang / purrr он используется как своего рода сокращенная анонимная функция для игры в гольф, где function(z) z*2 —> > ~ .x*2 или просто ~ .*2 . (3) По сути, он используется для объявления переменной, которая будет использоваться, но способом NSE. (Возможно, в этом есть что-то большее, иначе мне это кажется малоэффективным.)

Ответ №1:

Как сказал @r2evans в комментарии, он используется для создания формулы. Это быстрый способ сделать две вещи: записать немного языка R без его оценки и связать среду, в которой он был создан, с результатом.

Различия между вещами заключаются в том, как функции, в которых он используется, используют объект формулы. Например, lm() функция в базе R говорит, что выражения слева от тильды рассматриваются как ответы, а выражения справа кодируют объясняющие переменные.

Причина plot_ly , по которой он используется, заключается в том, что имена, которые он использует ( gdpPercap и т. Д.), Не обязательно должны быть переменными, видимыми в текущей глобальной среде, они могут быть столбцами, взятыми из data аргумента. Этот аргумент стоит на первом месте, поэтому с трубами вы можете говорить такие вещи, как

 df <- data.frame(a=1:10)
b <- rnorm(10)
df %>% plot_ly(x = ~a, y = ~b)   # incomplete example...
 

и он может искать a в df b глобальной среде и в ней.

Что касается вашего последнего вопроса, вы можете поместить несинтаксические имена в обратные ссылки, например

 `a/b` <- 3
`a/b`
# [1] 3