为什么 ggplot 注释会抛出此警告:在 is.na(x) 中:is.na() 应用于 'expression' 类型的非(列表或向量)

Why does ggplot annotate throw this warning: In is.na(x) : is.na() applied to non-(list or vector) of type 'expression'

我想用一个简单的方程来注释 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

annotate() function does not support expressions。你需要传入一个字符串并设置parse=TRUE。你可以做到

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

在没有警告的情况下 运行 代码的方法是将表达式作为列表传递并设置 parse = TRUE.

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

reprex package (v0.3.0)

于 2021-02-01 创建

尝试对表达式求值 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() 引导我使用这些功能来发现这一点。