В чем разница между sym () и parse_expr () в пакете rlang? - PullRequest
0 голосов
/ 03 мая 2018

При использовании пакета rlang мне интересно, в чем разница между sym () и parse_expr (). Рассмотрим, например, следующие выражения:

ex1 = sym('a')
ex2 = parse_expr('a')

Они оба возвращаются

a

identical(ex1, ex2)
[1] TRUE

Предположим, теперь мне нужно выражение:

ex3 = quo(!!sym('a'))
ex4 = quo(!!parse_expr('a'))

В обоих случаях результат:

<quosure>
expr: ^a
env:  global

identical(ex3, ex4)
[1] TRUE

Однако по следующим причинам два следующих не совпадают.

ex5 = quo(!!sym('a - b'))
ex6 = quo(!!parse_expr('a - b'))

Очевидно, они идентичны, поскольку оба возвращаются:

<quosure>
expr: ^a - b
env:  global

Тем не менее,

identical(ex5, ex6)
[1] FALSE

Какой-то мой вопрос: в чем разница между sym () и parse_expr ()? Что один делает, а другой нет? И почему ex5, по-видимому, похож на ex6, но идентично (ex5, ex6) возвращает FALSE?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Чтобы дополнить предыдущий ответ, обратите внимание, что ex5 и ex6 на самом деле не идентичны.

a <- 5
b <- 3
eval_tidy(ex6)
# [1] 2
eval_tidy(ex5)
# Error in eval_tidy(ex5) : object 'a - b' not found
`a - b` <- pi
eval_tidy(ex5)
# [1] 3.141593
0 голосов
/ 03 мая 2018

Ссылка на мой ответ на этот вопрос :

Символ - это способ ссылки на объект R, в основном это «имя» объекта. Таким образом, sym аналогично as.name в базе R. parse_expr, с другой стороны, преобразует некоторый текст в выражения R. Это похоже на parse в базе R.

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

Как правило, вы будете использовать sym, когда ваша строка ссылается на объект (хотя parse_expr также будет работать), и использовать parse_expr, когда вы пытаетесь проанализировать любой другой код R. для дальнейшей оценки.

Для вашего первого примера, a может быть как именем, которое ссылается на объект, так и выражением, поэтому превращение его в sym или parse_expr практически будет означать одно и то же.

Для вашего последнего примера, однако, a - b действительно является выражением (если у вас нет объекта R со странным именем a - b). Распечатав следующее, вы увидите, что использование sym против parse_expr для кода R , предназначенного для выражения, а не для объекта R дает два разных результата:

> quo(!!sym('a - b'))
<quosure: global>
~`a - b`

> quo(!!parse_expr('a-b'))
<quosure: global>
~a - b

Здесь sym превращает a - b в имя / символ объекта, следовательно, оборотная сторона тикает вокруг a - b, тогда как parse_expr превращает его в выражение, как и ожидалось.

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