Ссылка на мой ответ на этот вопрос :
Символ - это способ ссылки на объект 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
превращает его в выражение, как и ожидалось.