name - title in ggplot2 r




Являются ли эти строки или переменные? (3)

обещания

Когда аргумент передается функции, он не передается как значение, а передается как обещание, которое состоит из

  • выражение или код, который вызывающий использует как фактический аргумент
  • среда, в которой это выражение должно быть оценено, а именно: окружение вызывающего абонента.
  • значение, которое выражение представляет, когда выражение оценивается в среде обещания - этот слот не заполняется до тех пор, пока обещание не будет фактически оценено. Он никогда не будет заполнен, если функция никогда не обратится к нему.

Пакет pryr может показать информацию в обещании:

library(pryr)

g <- function(x) promise_info(x)
g(ggplot2)

давая:

$code
ggplot2  <-- the promise x represents the expression ggplot2

$env
<environment: R_GlobalEnv>  <-- if evaluated it will be done in this environment

$evaled
[1] FALSE  <-- it has not been evaluated

$value
NULL  <-- not filled in because promise has not been evaluated

Единственный из вышеперечисленных слотов в выводе pryr, к которому можно получить доступ на уровне R, не записывая функцию C для его выполнения (или используя пакет, такой как pryr, который обращается к такому C-коду), является слотом кода. Это можно сделать с помощью substitute(x) функции R substitute(x) (или других средств). С точки зрения выхода pryr, применяемого к обещанию, возвращается слот кода без оценки обещания. То есть, слот значения не изменяется. Если бы мы обратились к x обычным способом, то есть не через substitute , тогда код был бы оценен в среде обещания, сохранен в слоте значения, а затем передан в выражение в функции, которая обращается к нему.

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

f <- function(x) as.character(substitute(x))
f("ggplot2")
## [1] "ggplot2"
f(ggplot2)
## [1] "ggplot2"

библиотека

Фактически, library использует эту идиому, то есть as.character(substitute(x)) , чтобы обрабатывать свой первый аргумент.

АЕС

Функция aes использует match.call чтобы получить весь вызов в качестве выражения, и поэтому в некотором смысле это альтернатива substitute . Например:

h <- function(x) match.call()
h(pi + 3)
## h(x = pi + 3)

Заметка

Нельзя сказать, не глядя на документацию или код функции, как она будет обрабатывать свои аргументы.

Исходя из фона C / Python / Java, мне трудно понять некоторый синтаксис R, где литералы выглядят как переменные, но, похоже, ведут себя как строки. Например:

library(ggplot2)
library("ggplot2")

Две линии ведут себя одинаково. Тем не менее, я ожидаю, что первая строка будет означать «загрузить библиотеку, имя которой хранится в переменной ggplot2» и дать ошибку, как object 'ggplot2' not found .

Говоря о ggplot2:

ggplot(data, aes(factor(arrivalRate), responseTime, fill=factor(mode))) +
  geom_violin(trim=FALSE, position=dodge)

Переменные arrivalRate , responseTime и mode не существуют, но как-то R знает, как их искать в кадре данных. Я предполагаю, что aes фактически получает строки, которые затем обрабатываются с использованием чего-то вроде eval .

Как R-код синтаксического анализа, который в конечном итоге интерпретирует некоторые литералы как строки?


Интересным причудом языка R является способ оценки выражений. В большинстве случаев R ведет себя так, как вы ожидали. Выражения в кавычках рассматриваются как строки, все остальное рассматривается как переменная, функция или другой токен. Но некоторые функции допускают «нестандартную оценку», в которой некорректное выражение оценивается более или менее, как если бы оно было цитируемой переменной. Наиболее распространенным примером этого является способ загрузки библиотек (который позволяет использовать имена некотируемых или цитируемых библиотек) и его сжатый интерфейс формул. Другие пакеты могут использовать NSE. Hadley Wickham широко использует его во всех своих чрезвычайно популярных пакетах tidyverse . Помимо сохранения пользователем нескольких символов ввода, NSE имеет ряд полезных свойств для динамического программирования.

Как было отмечено в другом ответе, у Уикхема есть отличный учебник о том, как все это работает . В пользовательском интерфейсе пользователей Lounge также есть большой рабочий документ по этой теме .


Эта концепция называется «нестандартная оценка», и существует множество различных способов ее использования в разных R-функциях. См. Эту главу книги для введения.

Эта языковая функция может вводить в заблуждение и, возможно, не нужна для функции library() , но она позволяет использовать невероятно мощный код, когда вам нужно указывать вычисления в кадрах данных, как, например, в ggplot2 или в dplyr.





ggplot2