关于 `rstatix` 包中的函数 `get_test_label` 和 `get_pwc_label` 的问题

Question about the functions `get_test_label` and `get_pwc_label` from the `rstatix` package

我最近熟悉了 rstatix 包。下面是使用此包中函数的示例代码。

library(tidyverse)
library(rstatix)
library(ggpubr)

set.seed(1111)
n=100
df = tibble(
  x1 = rnorm(n, 0, 1.1),
  x2 = rnorm(n, 0.2, .1),
  x3 = rnorm(n, -.2, .2),
  x4 = rnorm(n, 0, 2),
) %>% pivot_longer(x1:x4)
df

pwc = df %>%
  pairwise_t_test(value~name, paired = TRUE,
                  p.adjust.method = "bonferroni") %>%
  add_xy_position(x = "name") %>%
  mutate(name=group1,
         lab = paste(p, " - ", p.adj.signif))
res.test = df %>% anova_test(value~name)

df %>% ggplot(aes(name, value))+
  geom_boxplot(alpha=0.6)+
  stat_pvalue_manual(pwc, step.increase=0.05, label = "lab")+
  labs(title = get_test_label(res.test, detailed = TRUE),
       subtitle = get_pwc_label(pwc))

但是,我注意到 get_test_labelget_pwc_label 等函数不会 return 文本,而是准备文本的命令。

例如,调用 get_test_label(res.test, detailed = TRUE) 得到:

paste("Anova, ", italic("F"), "(3,396)", " = ", 
    "5.26, ", italic("p"), " = ", "0.001", 
    paste(", ", eta["g"]^2, " = ", 0.04), "")

反过来,调用 get_pwc_label(pwc) 将导致:

paste("pwc: ", bold(c(t_test = "T test")), "; p.adjust: ", 
    bold("Bonferroni"))

现在我的问题,基本上是两个问题。

  1. 这些功能不是return文本而是命令的原因是什么?
  2. 如何制作您自己的 return 类似命令的函数。

R 的图形设备使用 ?plotmath 中定义的语法来区分文字和格式化文本。这种语法的一个基本特征是字符串定义文字文本,而函数定义对文本的操作,例如并置和格式化(更改字体、添加变音符号、在数学公式中正确使用空格等)。那么,您看到的是未计算的函数组合和定义格式化文本的字符串。这些通常称为 plotmath 表达式。

我可以为您提供一个基本示例,展示不同的表达式如何转换为图形输出,但 R 中内置了一个出色的演示:只需 运行 demo("plotmath") 在交互式 R session 并按照提示进行操作。

可用于创建表达式的函数包括 quotesubstitutebquotestr2lang。您可能会使用其中之一来格式化,例如,情节标题。以下是我将如何使用每个函数生成表达式 paste("Michaelis constant: ", italic("K")["M"], " = ", 0.015).

quote(
  paste("Michaelis constant: ", italic("K")["M"], " = ", 0.015)
)

substitute(
  paste("Michaelis constant: ", italic(sym)[sub], " = ", val),
  list(sym = "K", sub = "M", val = 0.015)
)

sym <- "K"
sub <- "M"
val <- 0.015
bquote(
  paste("Michaelis constant: ", italic(.(sym))[.(sub)], " = ", .(val))
)

str2lang(
  'paste("Michaelis constant: ", italic("K")["M"], " = ", 0.015)'
)

差异很细微,因此值得浏览每个函数的帮助页面并运行查看那里的示例。

可用于创建表达式 向量 的函数包括 expressionstr2expression。您可以使用其中之一来一次格式化一个或多个标签,例如,在定义轴刻度标签时。以下是我将如何使用每个函数以 10 的递增幂为刻度格式化标签:

expression(10^0, 10^1, 10^2, 10^3, 10^4, 10^5)
str2expression(paste0(10, "^", 0:5))

最后,这是一个将所有内容组合在一起的有趣情节:

plot.new()
plot.window(c(0, 1), c(1, 100000), log = "y")
box()
title(main = quote(paste("Michaelis constant: ", italic("K")["M"], " = ", 0.015)))
axis(side = 2, at = 10^(0:5), labels = str2expression(paste0(10, "^", 0:5)), las = 1)
text(x = seq(0, 1, by = 0.2), y = 10^(0:5), labels = str2expression(sprintf('%s("%s")', c("plain", "bold", "italic", "bolditalic", "symbol", "underline"), month.abb[1:6])))

有关更多示例,请查看 ?plotmath