Почему аннотация ggplot выдает это предупреждение: В is.na(x): is.na() применяется к не-(списку или вектору) типа «выражение»

Я хотел бы аннотировать график ggplot простым уравнением. Код ниже делает это, но выдает предупреждение о применении is.na():

library(ggplot2)
ggplot() +
  annotate(geom = "text", x = 1, y = 1, 
           label = expression(paste(beta, pi, "(1-" , pi, ")")),
           hjust = "left")
Warning message:
In is.na(x) : is.na() applied to non-(list or vector) of type 'expression'

Каков правильный синтаксис для включения выражения без предупреждения?

Почему это не заставляет предупреждение исчезнуть?

suppressWarnings(
  ggplot() +
    annotate(geom = "text", x = 1, y = 1, 
             label = expression(paste(beta, pi, "(1-" , pi, ")")),
             hjust = "left")
)

Я использую R версии 4.0.2 с ggplot2 версии 3.3.2.


person itsMeInMiami    schedule 26.07.2020    source источник


Ответы (2)


Функция annotate() не поддерживает выражения. вам нужно передать строку и установить parse=TRUE. Ты можешь сделать

  annotate(geom = "text", x = 1, y = 1, 
           label = 'paste(beta, pi, "(1-" , pi, ")")', parse=TRUE,
           hjust = "left")
person MrFlick    schedule 26.07.2020
comment
Связанная ветка интересна, но ей 5 лет, и тогда она, казалось, потерпела неудачу. код OP действительно приводит к хорошо проанализированному выражению, но только с предупреждением. Поэтому я не уверен, правда ли, что annotate не поддерживает выражения. - person tjebo; 31.01.2021

Чтобы запустить код без предупреждения, нужно передать выражение в виде списка и установить parse = TRUE.

library(ggplot2)
ggplot() +
  annotate(geom = "text", x = 1, y = 1, 
           label = list('paste(beta, pi, "(1-" , pi, ")")'),
           hjust = "left", parse = TRUE)

Создана 01 февраля 2021 г. с помощью пакета reprex (v0.3.0)

Предупреждение генерируется при попытке вычислить is.na() в выражении.

is.na(expression(1 + 2))
#> Warning in is.na(expression(1 + 2)): is.na() applied to non-(list or vector) of
#> type 'expression'
#> [1] FALSE

В ggplot2 такая проверка происходит в ggplot2:::is_complete(expression(1 + 2)), которая вызывается в ggplot2:::detect_missing. Я узнал об этом, установив options(warn = 2), а затем с помощью traceback() привел меня к этим функциям.

person teunbrand    schedule 01.02.2021
comment
Благодарю. Вот та непонятная функция под капотом, которую я искал :) - person tjebo; 01.02.2021
comment
спасибо Tjebo, рад помочь :) - person teunbrand; 01.02.2021